打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。

下面给大家分享一份成为资深架构师学习路线

分布式专题

双十一架构专题

性能优化专题

源码分析专题

工程化专题

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
面试官最爱问的8个并发问题,你知道答案吗?
java的volatile是什么意思?
快速掌握并发编程---深入了解volatile
【JAVA并发第四篇】线程安全
Java内存模型详解
你真的了解 volatile 关键字吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服