Java多线程---volatile到底有啥用?

volatile

简介

它是JVM提供的轻量级同步机制,也是一个关键字

有什么特性?

它的特性:

  • 在被它修饰的变量被修改之后,其它线程会立即感知到这个变化,也就是全局可见性
  • 它可以禁止指令重排

它是如何保证立即可见的?

  1. 当被volatile修饰的变量被修改之后,JMM会将当前线程的本地变量刷新写到主内存中
  2. 当其他线程尝试去读这个元素的时候,JMM会将当前线程的本地工作内存置为无效,只能再次去读主存中内容

它是如何禁止指令重排的?

编译器和cpu会使代码结构重排,达到最佳效果,我刚刚看到一篇JVM内存模型、指令重排、内存屏障的博客,挺好,我会将另一篇博客中详细讲这个概念。我就着重看总结下它是如何禁止指令重排的:

  1. 通过插入内存屏障指令来禁止内存屏障前后的指令进行重排优化
  2. 强制刷新各种CPU的缓存数据,使任何运行在CPU上的线程都能得到这个最新的数据

猜你喜欢

转载自blog.csdn.net/MarkusZhang/article/details/106186369