读书频道 > 网站 > 网页设计 > Java并发编程的艺术
3.4.2 volatile写-读建立的happens-before关系
15-08-27    下载编辑
收藏    我要投稿   

本文所属图书 > Java并发编程的艺术

并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技立即去当当网订购
上面讲的是volatile变量自身的特性,对程序员来说,volatile对线程的内存可见性的影响比volatile自身的特性更为重要,也更需要我们去关注。
 
从JSR-133开始(即从JDK5开始),volatile变量的写-读可以实现线程之间的通信。
 
从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:volatile写和锁的释放有相同的内存语义;volatile读与锁的获取有相同的内存语义。
 
请看下面使用volatile变量的示例代码。
 
class VolatileExample {
    int           a = 0;
    volatile boolean f?lag = false;

    public void writer() {
        a = 1; // 1
        f?lag = true; // 2
    }

    public void reader() {
        if (f?lag) { // 3
            int i = a; // 4
            ……
        }
    }
}

 

假设线程A执行writer()方法之后,线程B执行reader()方法。根据happens-before规则,这个过程建立的happens-before关系可以分为3类:
 
1)根据程序次序规则,1 happens-before 2; 3 happens-before 4。
 
2)根据volatile规则,2 happens-before 3。
 
3)根据happens-before的传递性规则,1 happens-before 4。
 
上述happens-before关系的图形化表现形式如下。
 
 
在上图中,每一个箭头链接的两个节点,代表了一个happens-before关系。黑色箭头表示程序顺序规则;橙色箭头表示volatile规则;蓝色箭头表示组合这些规则后提供的happens-before保证。
 
这里A线程写一个volatile变量后,B线程读同一个volatile变量。A线程在写volatile变量之前所有可见的共享变量,在B线程读同一个volatile变量后,将立即变得对B线程可见。
 
本文统一用粗实线标识组合后产生的happens-before关系。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站