Java的锁

1.1 锁的内存语义

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

1.2 锁的释放

  • 线程A释放锁后,会将共享变更操作刷新到主内存中
Java的锁_第1张图片
1.2.jpeg

1.3 锁的获取

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

1.4 锁的释放与获取

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

参考

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

你可能感兴趣的:(Java的锁)