Skip to content
目录概览

volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?

volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。但无法保证原子性,对于多个线程访问同一个实例变量需要加锁进行同步。

在 Java 中除了 long 和 double 之外的所有基本类型的读和赋值,都是原子性操作。而 64 位的 long 和 double 变量由于会被 JVM 当作两个分离的 32 位来进行操作,所以不具有原子性,会产生字撕裂问题。但是当你定义 long 或 double 变量时,如果使用 volatile 关键字,就会获到(简单的赋值与返回操作的)原子性。