锁的内存语义

(已迁移)
1
class MonitorExample{ 2 int a = 0; 3 4 public synchronized void writer(){ 5 ++a; 6 } 7 8 public synchronized void reader(){ 9 int i = a; 10 ...... 11 } 12 }

  假设线程A执行writer()方法,线程B执行reader()方法。

  

--  当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。

--  当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。

 

--  对比锁释放-获取的内存语义与volatile写-读的内存语义可以看出:释放锁与volatile写有相同的内存语义;锁获取与volatile读有相同的内存语义。

 

  即总结如下:

  --  线程A释放一个锁,实质上是线程A向接下来要获取这个锁的某个线程做出了(线程A对共享变量所做修改的)消息。

  --  线程B获取一个锁,实质上是线程B接收了之前某个线程发出的(在释放这个锁之前对共享变量所做修改的)消息。

  --  线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过主内存向线程B发送消息。

 

(参考:Java并发编程的艺术)

posted @ 2020-10-13 22:44  α_伊卡洛斯  阅读(90)  评论(0)    收藏  举报