##基本概念volatile
是Java语言提供的一种synchronized
的弱化版本- volatile
变量的内存可见性得到保证。也就是说对 volatile
变量的更改对其他所有线程都是可见的,不需要 synchronized
。当一个变量被声明为 volatile
,编译器和运行时(JVM、OS等)都注意到这个变量是被共享的,这个变量上的操作不应该和其他内存操作一起被重排序。 volatile
变量不会被缓存在寄存器或则缓存(L1,L2等)上(缓存会使得变量对于其他核心不可见),所以说对一个 volatile
变量的读写总会获得最新的值。(多线程环境下对普通变量很可能获得的是最近的某一个值,而不一定是最新的。可以参考java内存模型)
简单的说,volatile
提供如下的功能:
- 可见性(某个线程更改过后其他线程可以看到)
- 防止被重拍序
必须注意的是, volatile
不保证互斥性,也就是说在没有其他同步措施的情况下多个线程对一个 volatile
变量进行写是会造成并发冲突的