volatile

线程间共享变量需要使用 volatile 关键字标记,确保每个线程都能读取到更新后的变量值。
为什么要对线程间共享的变量用关键字 volatile 声明?这涉及到 Java 的内存模型。在 Java 虚拟机中,变量的值保存在主内存中,但是,当线程访问变量时,它会先获取一个副本,并保存在自己的工作内存中。如果线程修改了变量的值,虚拟机会在某个时刻把修改后的值回写到主内存,但是,这个时间是不确定的!
image
这会导致如果一个线程更新了某个变量,另一个线程读取的值可能还是更新前的。例如,主内存的变量 a = true ,线程 1 执行 a = false 时,它在此刻仅仅是把变量 a 的副本变成了 false ,主内存的变量 a 还是 true ,在 JVM 把修改后的 a 回写到主内存之前,其他线程读取到的 a 的值仍然是 true ,这就造成了多线程之间共享的变量不一致。
因此,volatile 关键字的目的是告诉虚拟机:

  • 每次访问变量时,总是获取主内存的最新值
  • 每次修改变量后,立刻回写到主内存

volatile 关键字解决的是可见性问题:当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。
如果我们去掉 volatile 关键字,运行程序,发现效果和带 volatile 差不多,这是因为在 x86 的架构下,JVM 回写主内存的速度非常快,但是,换成 ARM 的架构,就会有显著的延迟。

posted @ 2023-07-03 22:09  HopeLive  阅读(23)  评论(0)    收藏  举报