A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李江 中级黑马   /  2013-10-8 08:11  /  1278 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[转自]:http://www.infoq.com/cn/articles ... ontent_articles_clk
锁的释放-获取建立的happens before 关系

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

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

  1. class MonitorExample {
  2.     int a = 0;

  3.     public synchronized void writer() {  //1
  4.         a++;                             //2
  5.     }                                    //3

  6.     public synchronized void reader() {  //4
  7.         int i = a;                       //5
  8.         ……
  9.     }                                    //6
  10. }
复制代码
假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens before规则,这个过程包含的happens before 关系可以分为两类:
  • 根据程序次序规则,1 happens before 2, 2 happens before 3; 4 happens before 5, 5 happens before 6。
  • 根据监视器锁规则,3 happens before 4。
  • 根据happens before 的传递性,2 happens before 5。

上述happens before 关系的图形化表现形式如下(图一):

在上图中,每一个箭头链接的两个节点,代表了一个happens before 关系。黑色箭头表示程序顺序规则;橙色箭头表示监视器锁规则;蓝色箭头表示组合这些规则后提供的happens before保证。
上图表示在线程A释放了锁之后,随后线程B获取同一个锁。在上图中,2 happens before 5。因此,线程A在释放锁之前所有可见的共享变量,在线程B获取同一个锁之后,将立刻变得对B线程可见。


图1.jpg (42.59 KB, 下载次数: 11)

图一

图一

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马