读书频道 > 网站 > 网页设计 > Java并发编程的艺术
3.6.1 final域的重排序规则
15-08-27    下载编辑
收藏    我要投稿   

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

并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技立即去当当网订购
3.6 final域的内存语义
 
与前面介绍的锁和volatile相比,对final域的读和写更像是普通的变量访问。下面将介绍final域的内存语义。
 
3.6.1 final域的重排序规则
 
对于final域,编译器和处理器要遵守两个重排序规则。
 
1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
 
2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
 
下面通过一些示例性的代码来分别说明这两个规则。
 
public class FinalExample {
    int i; // 普通变量
    f?inal int j; // f?inal变量
    static FinalExample obj;

    public FinalExample () { // 构造函数
        i = 1; // 写普通域
        j = 2; // 写f?inal域
    }

    public static void writer () { // 写线程A执行
        obj = new FinalExample ();
    }

    public static void reader () { // 读线程B执行
        FinalExample object = obj; // 读对象引用
        int a = object.i; // 读普通域
        int b = object.j; // 读final域
    }
}

 

 
这里假设一个线程A执行writer()方法,随后另一个线程B执行reader()方法。下面我们通过这两个线程的交互来说明这两个规则。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

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