本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
volatile关键字有什么用?
338
今天的工作中,我遇到了volatileJava中的关键字。我不太熟悉它,所以找到了这种解释。
鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用该关键字的情况?
高分回答:
volatile具有内存可见性的语义。基本上,volatile字段的值在对它的写入操作完成之后对所有读取器(尤其是其他线程)都变为可见。没有volatile,读者可能会看到一些未更新的值。
回答您的问题:是的,我使用一个volatile变量来控制某些代码是否继续循环。循环测试该volatile值,如果为,则继续true。可以false通过调用“停止”方法将条件设置为。false在stop方法完成执行之后,当循环测试值时,该循环将看到并终止。
我强烈推荐的书“ Java Concurrency in Practice ”很好地解释了volatile。这本书是由撰写该问题中引用的IBM文章的同一人撰写的(实际上,他在该书的底部引用了他的书)。我使用的volatile是他的文章所说的“模式1状态标志”。
如果您想了解有关幕后volatile工作原理的更多信息,请阅读Java内存模型。如果您想超越该级别,请阅读Hennessy&Patterson这样的优秀计算机体系结构书籍,并阅读有关高速缓存一致性和高速缓存一致性的信息。
文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…
作者建议:这个东西挺重要的,内存模型,甚至到mesi协议,总线风暴,静止指令重排序,as-if-serial(不管怎么重排序,单线程下的执行结果不能被改变。),内存屏障(内存屏障指令来禁止特定类型的处理器重排序。), happens-before(如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。)
volatile修饰符适用于以下场景:
某个属性被多个线程共享,其中有一个线程修改了此属性,其他线程可以立即得到修改后的值,比如booleanflag;或者作为触发器,实现轻量级同步。
volatile属性的读写操作都是无锁的,它不能替代synchronized,因为它没有提供原子性和互斥性。因为无锁,不需要花费时间在获取锁和释放锁上,所以说它是低成本的。v
olatile只能作用于属性,我们用volatile修饰属性,这样compilers就不会对这个属性做指令重排序。volatile提供了可见性,任何一个线程对其的修改将立马对其他线程可见,volatile属性不会被线程缓存,始终从主 存中读取。
volatile提供了happens-before保证,对volatile变量v的写入happens-before所有其他线程后续对v的读操作。
volatile可以使得long和double的赋值是原子的。volatile可以在单例双重检查中实现可见性和禁止指令重排序,从而保证安全性。
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️