【发布时间】:2017-07-13 17:33:14
【问题描述】:
我正在学习 volatile 变量。我知道 volatile 的作用,我为 Volatile 变量编写了一个示例程序,但没有按预期工作。
为什么“count”的最终值有时会小于 2000。我使用了 volatile,因此系统不应缓存“count”变量,并且该值应始终为 2000。
当我使用同步方法时,它可以正常工作,但在 volatile 关键字的情况下却不行。
public class Worker {
private volatile int count = 0;
private int limit = 10000;
public static void main(String[] args) {
Worker worker = new Worker();
worker.doWork();
}
public void doWork() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException ignored) {}
System.out.println("Count is: " + count);
}
}
提前谢谢你!
【问题讨论】:
-
volatile 和 synchronized 不一样...改用 Atomic ....
-
“我知道 volatile 做什么” 无意冒犯,但这个问题证明并非如此。
-
“我使用了 volatile 因此系统不应该缓存“count”变量”,除了竞争条件(这里的明显问题),这是完全错误的。 Volatile 不会阻止 CPU 在内存中缓存值 - 甚至没有任何方法可以告诉现代 CPU 做这样的事情,因为这毫无意义。 Volatile 做了一些非常不同的事情,如果不了解内存顺序和可见性保证是什么,你真的不应该使用它(在你理解它之后,你会注意到周围有更好的高级解决方案)。
标签: java multithreading