Volatile 关键字概述
定义:volatile
是一个修饰符,用于修饰变量。它可以确保此变量对所有线程的可见性。
可见性:当一个变量被声明为 volatile
后,对这个变量的读写将会直接操作主内存。这意味着当一个线程修改了一个 volatile
变量时,新值对于其他线程是立即可见的。
禁止指令重排序:volatile
还可以防止指令重排序。在运行时,为了提高性能,编译器和处理器可能会对指令进行重新排序。使用 volatile
变量时,它会告诉编译器和处理器不允许对这个变量附近的代码进行重排序优化
用途限制:虽然 volatile
变量确保操作的可见性,但它并不执行互斥访问,因此它不适用于那些需要多个操作作为一个不可分割的整体来执行的情况(即 volatile
不保证原子性)。
适用场景:volatile
适用于简单的标志位,例如停止线程的标志。这种情况下,volatile
变量是一个很好的选择,因为它不涉及复杂的原子性保证。
被 volatile 修饰的变量有 2 大特点
特点
- 可见性
- 有序性(排序要求)
volatile 的内存语义
- 当写一个 volatile 变量时,JMM 会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。
- 当读一个 volatile 变量时,JMM 会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量
volatile 的写内存语义是直接刷新到主内存中,读内存语义是直接从主内存中读取。