1.1 锁的内存语义
- 锁可以让临界区互斥执行,还可以让释放锁的线程向同一个锁的线程发送消息
- 锁的释放要遵循Happens-before原则(锁规则:解锁必然发生在随后的加锁之前)
- 锁在Java中的具体表现是 Synchronized 和 Lock
1.2 锁的释放
- 线程A释放锁后,会将共享变更操作刷新到主内存中
1.3 锁的获取
- 线程B获取锁时,JMM会将该线程的本地内存置为无效,被监视器保护的临界区代码必须从主内存中读取共享变量
1.4 锁的释放与获取
- 锁获取与volatile读有相同的内存语义,读者可参见笔者的
- 线程A释放一个锁,实质是线程A告知下一个获取到该锁的某个线程其已变更该共享变量
- 线程B获取一个锁,实质是线程B得到了线程A告知其(在释放锁之前)变更共享变量的消息
- 线程A释放锁,随后线程B竞争到该锁,实质是线程A通过主内存向线程B发消息告知其变更了共享变量