java并发-锁的内存语义
3.5锁的内存语义
3.5.1 锁的释放-获取建立的happens-before关系
3.5.2 锁的释放和获取的内存语义
当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。
当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的 临界区代码必须从主内存中读取共享变量。
3.5.3 锁内存语义的实现
ReentrantLock, volatile+cas
3.5.4 concurrent包的实现
由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现 在有了下面4种方式。
- 1)A线程写volatile变量,随后B线程读这个volatile变量。
- 2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。
- 3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。
- 4)A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。
仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式。
首先,声明共享变量为volatile。
然后,使用CAS的原子条件更新来实现线程之间的同步。
同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的 通信。