volatile 保证线程可见性
先贴上代码
变量 running 前面不加 volatile 修饰时:
package test;
import java.util.concurrent.TimeUnit;
public class T01_HelloVolatile {
boolean running = true;
void m() {
System.out.println("m start");
while (running) {
}
System.out.println("m end");
}
public static void main(String[] args) {
T01_HelloVolatile t = new T01_HelloVolatile();
new Thread(t::m,"t1").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.running = false;
}
}
程序的执行结果:
我们可以发现,程序是一个死循环,永远不会结束,虽然在主线程里修改了变量 running 的值,但是 running 的值没有及时更新到内存,因此,t1线程无法及时拿到更新后的 running 值, while (running) {} 的执行结果永远为 true,循环永远不会结束。
变量 running 的值是存在内存里面的,内存的速度约是CPU速度的1/100。
加了 volatile 后,变量 running 就变成了线程可见性的。
那么,在程序运行的过程中