请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?

关键字 volatile 是 Java 虚拟机提供的最轻量级的同步机制。

当一个变量被定义成 volatile 之后,具备两种特性:

  • 一、保证此变量对所有线程的可见性。当一条线程修改了这个变量的值,新值对于其他线程是可以立即得知的。而普通变量做不到这一点。
  • 二、禁止指令重排序优化。普通变量仅仅能保证在该方法执行过程中,得到正确结果,但是不保证程序代码的执行顺序。

Java 的内存模型定义了 8 种内存间操作:

lock 和 unlock

  • 把一个变量标识为一条线程独占的状态。
  • 把一个处于锁定状态的变量释放出来,释放之后的变量才能被其他线程锁定。

read 和 write

  • 把一个变量值从主内存传输到线程的工作内存,以便 load。
  • 把 store 操作从工作内存得到的变量的值,放入主内存的变量中。

load 和 store

  • 把 read 操作从主内存得到的变量值放入工作内存的变量副本中。
  • 把工作内存的变量值传送到主内存,以便 write。

use 和 assgin

  • 把工作内存变量值传递给执行引擎。
  • 将执行引擎值传递给工作内存变量值。

volatile 的实现基于这8 种内存间操作,保证了一个线程对某个 volatile 变量的修改,一定会被另一个线程看见,即保证了可见性。

回复

我来回复
  • 暂无回复内容

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部