簡體   English   中英

Java:有沒有正確的方法來使用靜態volatile變量?

[英]Java: Is there a right way to use static volatile variables?

我希望有一個可以從不同線程讀/寫的標志,沒有任何臟值問題。 是否足以使其靜態揮發?

static volatile boolean flag;

不,如果您需要這樣的動作,這還不夠:

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。 來源: 易揮發並不意味着原子!

如果在多線程場景中需要保證一致的結果,則應該使用Java中的Atomic類,如@ Eng.Fouad所指出的那樣。

在布爾值的情況下,比較和設置將比AtomicBoolean類有用,而不是使用volatile。

它很誘人,但避免這樣的代碼。

在一個簡單的場景中,這似乎有效,因為boolean不允許任何數學運算(你只能為它賦值)。 但你很少有簡單的案例。 最終,你需要

if(flag) {
    flag = false;
}

而這段代碼有時會破裂。 因此,正如其他答案所建議的那樣,您應該使用java.util.concurrent.Atomic *類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM