Java的锁

1.1 锁的内存语义

  • 锁可以让临界区互斥执行,还可以让释放锁的线程向同一个锁的线程发送消息
  • 锁的释放要遵循Happens-before原则(锁规则:解锁必然发生在随后的加锁之前)
  • 锁在Java中的具体表现是 Synchronized 和 Lock

1.2 锁的释放

  • 线程A释放锁后,会将共享变更操作刷新到主内存中
1.2.jpeg

1.3 锁的获取

  • 线程B获取锁时,JMM会将该线程的本地内存置为无效,被监视器保护的临界区代码必须从主内存中读取共享变量
1.3.jpeg

1.4 锁的释放与获取

  • 锁获取与volatile读有相同的内存语义,读者可参见笔者的
  • 线程A释放一个锁,实质是线程A告知下一个获取到该锁的某个线程其已变更该共享变量
  • 线程B获取一个锁,实质是线程B得到了线程A告知其(在释放锁之前)变更共享变量的消息
  • 线程A释放锁,随后线程B竞争到该锁,实质是线程A通过主内存向线程B发消息告知其变更了共享变量

参考

并发番@Synchronized一文通(1.8版)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容