《Java高并发》线程同步基础1

1、synchronized锁的是堆里的对象,不是代码块;
如果指向的对象被替换了,那新对象锁就不存在了,其他线程就可以获得这个新对象的锁;
不要用常量作为锁的对象;
2、synchronized成员方法锁的是this对象
3、synchronized静态方法锁的是类的class对象(T.class)
4、synchronized获得的锁是可重入的
5、子类的synchronized方法调用父类的synchronized方法,也是可重入的
6、线程出现异常后,会释放synchronized锁
7、volatile可见性,当volatile声明的变量对应的内存被其他线程更新后,会通知CPU告诉它这块内存的值被更新了,需要重新读到CPU的缓存中计算
8、volatile只保证可见性,而synchronized既保证可见性并且保证原子性
9、AtomXXX类通过底层原子性设计,效率非常高,AtomXXX方法单一执行是原子性的,如果结合两个方法以上,一起就不是原子性了
10、synchronized代码块的语句越少,锁的粒度越小,效率越高
11、锁对象的wait、notify、notifyAll方法必须在synchronized代码块里执行;wait方法会让线程A阻塞,等待notify/notifyAll通知,当收到通知才会继续执行线程剩余的代码,但是执行剩余代码需要获得锁,所以其他线程B调用notify/notifyAll的时候,需要调用wait方法让出锁;A执行完代码之前,需要调用notify/notifyAll方法,通知B继续执行,A执行完代码,线程退出
12、CountDownLatch门闩,指定门上有几把钥匙,每次调用countDown都会开一把锁,当锁的数量为0的时候,调用了await的线程就会开门(开始执行)

推荐阅读更多精彩内容