我正在学习volatile变量。我知道什么是volatile,我为volatile变量编写了一个示例程序,但没有按预期工作。Java volatile关键字按预期工作
为什么“计数”未来一段时间小于2000年的终值我已经使用挥发性因此系统不应该缓存“计数”变量和值应始终是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);
}
}
谢谢您提前!
易失性和同步是不一样的...使用原子代替... –
*“我知道什么易变”*没有冒犯,但这个问题证明,否则。 – Tom
“我使用了volatile,因此系统不应该缓存”count“variable”,除了竞争条件(这里显而易见的问题),这是完全错误的。易失性不会阻止CPU缓存内存中的值 - 甚至没有办法告诉现代CPU做这样的事情,因为它毫无意义。 Volatile做了一些非常不同的事情,如果不了解内存排序和可视性保证是什么(并且在了解它之后你会注意到有更好的高级解决方案)。 – Voo