volatile变量赋值是原子的吗
java中volatile变量的读写操作本身是原子的,但“赋值”是否原子取决于赋值的类型。对于基本类型(如int、long、double),volatile保证了读写的原子性;但对于64位类型(long和double)在32位jvm上可能非原子,需显式声明volatile。复合操作(如i++)不是原子的,因为包含读、改、写三步。

哪些操作受volatile保证原子性
volatile仅保证单个变量的读写原子性和可见性,不保证复合操作的原子性。例如count = count + 1涉及读取、计算、写入三个步骤,即使count是volatile,该操作仍非原子。

public class VolatileTest {
private volatile int counter = 0;
public void increment() {
counter++; // 非原子操作:读-改-写
}
public int getCounter() {
return counter; // 原子读写
}
public static void main(String[] args) throws InterruptedException {
VolatileTest test = new VolatileTest();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
test.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
test.increment();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Final counter: " + test.getCounter());
// 预期输出:小于2000,因为counter++非原子
}
}
基于程序中某个输入、条件或结果的具体问题
当两个线程同时执行counter++时,由于缺乏同步机制,最终结果会小于预期值。这是因为volatile无法保证复合操作的原子性,需要借助synchronized或AtomicInteger来解决。
立即学习“Java免费学习笔记(深入)”;


















