我正在學習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