回答
不,如果你需要一個這樣的動作,這是不夠的:
volatile int v = 0;
Thread 1:
v++;
Thread 2:
v--;
理想情況下,你要V = 0時,當你執行上面的代碼,但是這是真的發生了(一複合動作):
Thread 1:
r1 = v;
r2 = r1 + 1;
v = r2;
Thread 2:
r3 = v;
r4 = r3 - 1;
v = r4;
而且這兩個線程將分別給出值1和-1。來源:Volatile Does Not Mean Atomic!
如果你需要在mulithreaded場景中保證一致的結果,你應該在Java中使用Atomic類作爲@ Eng.Fouad指出的。
在boolean的情況下,比起使用volatile的比較和設置將有助於AtomicBoolean類。
是的,它用於讀取,計算和保存數據的操作。但是,僅將讀/寫操作用作布爾變量是否正確? –
我沒有得到。你問是否正確使用r/w操作? (我剛剛回答) – zengr
不,我的意思是說我們有靜態易失標誌。然後我將它標記爲false,另一個線程讀取它,而其他線程將其標記爲true。在這種情況下,我會得到一個骯髒的價值觀? –
這很誘人,但避免這樣的代碼。
在一個簡單的情況下,這似乎工作,因爲boolean
不允許任何數學操作(您只能給它分配值)。但你很少有簡單的例子。最終,您將需要
if(flag) {
flag = false;
}
並且此代碼有時會中斷。因此,正如其他答案所建議的那樣,您應該使用java.util.concurrent.Atomic
*類。
- 1. 週期性更新靜態變量的正確方法
- 2. 不正確的使用靜態變量?
- 3. 將值賦給靜態變量的正確方法是什麼?
- 4. 如何在類方法中正確使用靜態變量?
- 5. 正確使用易失性變量和同步塊
- 6. 方法中是否需要「易失性」?
- 7. 是否有更容易的方法來連接使用JavaScript的變量?
- 8. 使用靜態易失性與靜態相關的實例數
- 9. 是否可以使用CoffeeScript來迭代類的靜態變量和方法?
- 10. 我是否正確使用靜態?
- 11. 靜態方法的Java實例變量
- 12. armcc是否使用-O0優化非易失性變量?
- 13. Java getResourceAsStream靜態解決方法。正確?
- 14. 使用「最終靜態」還是「靜態最終」是否正確?
- 15. 正確使用靜態方法
- 16. 方法和變量有非靜態需要是靜態錯誤
- 17. 正確使用易失性sig_atomic_t
- 18. 是否有可能在一個靜態方法使用Java
- 19. 靜態方法中的局部變量是否也是靜態的?
- 20. 同步靜態變量的方法是否夠用了?
- 21. 有沒有一種方法來確定在Java方法中使用的變量?
- 22. 我是否以正確的方式使用靜態?
- 23. 正確的方法來檢查局部變量是否等於局部變量
- 24. 靜態方法和靜態變量的Java
- 25. java中靜態方法中的靜態變量
- 26. PHP變量變量的靜態方法
- 27. 靜態constexpr變量是否有意義?
- 28. 我可以在java的靜態方法中使用非靜態變量嗎?
- 29. 在靜態方法中使用非靜態變量或調用非靜態方法(使用對象實例訪問)是否是一種很好的做法?
- 30. 在Java中,靜態方法中聲明的變量本身是靜態的嗎?
我不確定它是否足夠,但我建議使用['AtomicBoolean'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic改爲/AtomicBoolean.html)。 –
我會盡可能避免靜態可變字段。相反,我會使用AtomicBoolean傳遞給您想要標記的線程。 –