资讯专栏INFORMATION COLUMN

【java】知识系谱-基础篇-线程-volatile

_ivan / 2717人阅读

摘要:每个会缓存主存的共享变量,从而提高处理效率。为当前缓存行加入缓存一致性协议。任何修改,其他线程是可见的。修饰的变量还是会缓存的,只是通过一系列处理保证了所有线程看到这个变量的值是一致的

java并发编程实战对volatile的解释就是:当一个域声明为valatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。

表示呵呵哒。

官方解释:如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。
1.jvm对volatile变量做了什么事情?

在volatile声明的变量进行写操作的时候,JVM干了一件事,在前面加上了Lock为前缀的汇编代码。
我们先看下多处理器的高速缓存,再说加Lock会发生什么。
每个CPU会缓存主存的共享变量,从而提高处理效率。所以共享变量在每个CPU上都会有一份缓存。

2.Lock为前缀的汇编代码会发生什么?

多处理器下,Lock为前缀的汇编代码发生下面两件事情。
1.让当前缓存行写回到主存中。
2.为当前缓存行加入缓存一致性协议。(效果就是:其他处理器会将该缓存行置为失效)

3.什么是缓存一致性协议

MESI协议。确保多处理器下缓存是一致的。具体的协议内容可以自行百度,监听+广播+状态的控制去实现的。

4.针对volatile的内存语义、内存屏障这篇说的很好,直接上连接了

http://www.importnew.com/2786...
写的时候加了StroeLoad内存屏障,StroeLoad基于Lock指令实现的,所以编译后会有Lock为前缀的指令

5.总结

以上说明了volatile的可见性。任何修改,其他线程是可见的。同时也说明的java并发编程实战的解释不准确,甚至是错误的。volatile修饰的变量还是会缓存的,只是通过一系列处理保证了所有线程看到这个变量的值是一致的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69033.html

相关文章

  • java知识系谱-基础-线程-发布、逸出

    摘要:引用逸出基于外部方法发布对象引出引用逸出问题。并发编程实战的提到私有构造函数公共的工厂方法解决可能逸出的问题。同理在构造函数可以新建线程,当不要。下面代码就是错误的可以在构造函数中但是不要 java并发编程实战的解释,不够详细,尤其this引用逸出让人理解有些费解,java并发编程实战里面的内容就直接拷贝过来 发布:使对象能够在当前作用域之外的代码中使用 逸出:当某个不该被发布的对象被...

    时飞 评论0 收藏0
  • 后端知识- 收藏集 - 掘金

    摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...

    Youngdze 评论0 收藏0
  • 后端知识- 收藏集 - 掘金

    摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...

    scola666 评论0 收藏0
  • Javag工程师成神之路(2019正式版)

    摘要:结构型模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。行为型模式模版方法模式命令模式迭代器模式观察者模式中介者模式备忘录模式解释器模式模式状态模式策略模式职责链模式责任链模式访问者模式。 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新技术知识、完善知识体系 v2.0 2019-02-19 结构...

    Olivia 评论0 收藏0
  • 并发编程的艺术

    摘要:假设不发生编译器重排和指令重排,线程修改了的值,但是修改以后,的值可能还没有写回到主存中,那么线程得到就是很自然的事了。同理,线程对于的赋值操作也可能没有及时刷新到主存中。线程的最后操作与线程发现线程已经结束同步。 很久没更新文章了,对隔三差五过来刷更新的读者说声抱歉。 关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础的内容,注意,阅读本文需要一定的并发基础。 本文的...

    curlyCheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<