-
保证线程可见性
- 缓存一致性协议
-
禁止指令重排序
- JMM ,内存屏障
这个可以看单例模式的双重检查
线程可见性含义:
每个线程运行的时候,会先去主内存拷贝一份数据到自己的工作内存当中。
如果没有valatile,一个线程对某共享变量的值改变,可能不会马上通知到其他的线程。
而有了volatile,会把改变的值刷新到主内存,使其他线程可见。
public class T01_HelloVolatile {
/*volatile*/ boolean running = true; //对比一下有无volatile的情况下,整个程序运行结果的区别
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;
}
}
volatile不要修饰引用类型,因为引用里面的对象改变了,他察觉不到。
网友评论