volatile关键字如何满足并发编程的三大特性的?

那就要重提volatile变量规则: 对一个volatile域的写,happens-before于后续对这个volatile域的读。 这条再拎出来说,其实就是如果一个变量声明成是volatile的,那么当我读变量时,总是能读到它的最新值,这里最新值是指不管其它哪个线程对该变量做了写操作,都会立刻被更新到主存里,我也能从主存里读到这个刚写入的值。也就是说volatile关键字可以保证可见性以及有序性。

继续拿上面的一段代码举例:

这段代码不仅仅受到重排序的困扰,即使1、2没有重排序。3也不会那么顺利的执行的。假设还是线程1先执行write操作,线程2再执行multiply操作,由于线程1是在工作内存里把flag赋值为1,不一定立刻写回主存,所以线程2执行时,multiply再从主存读flag值,仍然可能为false,那么括号里的语句将不会执行。

如果改成下面这样:


那么线程1先执行write,线程2再执行multiply。根据happens-before原则,这个过程会满足以下3类规则:

程序顺序规则:1 happens-before 2; 3 happens-before 4; (volatile限制了指令重排序,所以1 在2 之前执行)

volatile规则:2 happens-before 3

传递性规则:1 happens-before 4

从内存语义上来看

当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存

当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个...
    卡巴拉的树阅读 2,897评论 1 26
  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,995评论 1 19
  • 有人问:这傻妮子从哪来? 有人答:许是从天上来。 那人又问:孙悟空还从石头缝里蹦出来的呢…… 其实,傻妮子没有了爹...
    郝逗阅读 1,231评论 0 1
  • 你要多努力,才能对得起你所吃过的苦!
    枫枫的小晴天阅读 76评论 0 0
  • 这是我回到工作地方的第二个礼拜,十四天窝在出租屋里除了睡觉就是看综艺娱乐。这期间大大小小的公司联系了16家,面试了...
    summer_204c阅读 244评论 0 0

友情链接更多精彩内容