Java并发编程的艺术》 —3.5 锁的内存语义

网友投稿 586 2022-05-30

3.5 锁的内存语义

众所周知,锁可以让临界区互斥执行。这里将介绍锁的另一个同样重要,但常常被忽视的功能:锁的内存语义。

3.5.1 锁的释放-获取建立的happens-before关系

锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。

下面是锁释放-获取的示例代码。

class MonitorExample {

int a = 0;

public synchronized void writer() {          // 1

a++;                               // 2

}                                       // 3

public synchronized void reader() {         // 4

int i = a;                         // 5

……

}                                       // 6

}

假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens-before规则,这个过程包含的happens-before关系可以分为3类。

1)根据程序次序规则,1 happens-before 2, 2 happens-before 3; 4 happens-before 5, 5 happens -before 6。

2)根据监视器锁规则,3 happens-before 4。

3)根据happens-before的传递性,2 happens-before 5。

《Java并发编程的艺术》 —3.5 锁的内存语义

上述happens-before关系的图形化表现形式如图3-24所示。

图3-24 happens-before关系图

在图3-24中,每一个箭头链接的两个节点,代表了一个happens-before关系。黑色箭头表示程序顺序规则;橙色箭头表示监视器锁规则;蓝色箭头表示组合这些规则后提供的happens-before保证。

图3-24表示在线程A释放了锁之后,随后线程B获取同一个锁。在上图中,2 happens-before 5。因此,线程A在释放锁之前所有可见的共享变量,在线程B获取同一个锁之后,将立刻变得对B线程可见。

Java

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Java并发编程的艺术》 —3.5.4 concurrent包的实现
下一篇:卷积层计算量(FLOPS)和参数量的计算
相关文章