2011-03-27 75 views
18

我可以聲明這樣的東西嗎?可以在java中將volatile變量定義爲static嗎?

static volatile boolean first=false; 
+18

你試過了嗎?發生了什麼? – Mat 2011-03-27 19:35:06

+13

此網站不是谷歌和閱讀文檔的替代品。這不是一個網站給你帶來「現成」的答案。您應該提出與編程相關的特定問題,以便您無法通過正常搜索輕鬆找到答案。如果你想得到好的答案,你至少應該試着清楚你的問題(拼寫,大小寫,代碼格式計數)。大約30多年的谷歌搜索可以找到這個問題的答案。 – Mat 2011-03-27 19:43:31

+1

@沙拉布:就是這一點。問問題是否可以自己輕鬆找到答案?本網站不打算讓人們提出問題,因爲他們喜歡這樣,這是爲了幫助有問題的人,最好是在他們自己去處理問題之後。而不是花30s自己找答案,而是用幾分鐘的時間來回答你應該能夠回答自己的問題。 – Mac 2011-03-27 19:57:32

回答

57

擴大Michael的評論。

static只是意味着不與包含類的實例關聯。

volatile僅表示該值可能會被其他線程更改而不發出警告。

所以你的問題可以歸結爲「可以與另一個線程沒有警告地更改與包含類的實例沒有關聯的字段嗎?」

正如Michael指出的那樣,這個問題的答案是肯定的。實例關聯與併發修改是正交的。

+6

現在,這就像一個非常棒的答案.. – 2011-03-27 19:45:36

+0

http://stackoverflow.com/questions/2423622/volatile-vs-static-in-java – 2013-10-13 18:21:46

+1

出於好奇,如果我們在那裏引入'final',會發生什麼? – Skynet 2015-03-17 09:22:23

7

當然。這兩種修飾語的效果是完全正交的。

19

是的,你可以。

A static Java中的變量每個類存儲一次(不是每個對象一次,比如非靜態變量)。這意味着所有的對象(和靜態方法)共享相同的變量。

聲明變量爲volatile(不管是否爲static)聲明該變量將被多個線程頻繁訪問。在Java中,這可以歸結爲指示線程無法緩存變量的值,但必須在變異後立即寫回,以便其他線程看到變化。 (默認情況下,Java中的線程可以自由緩存變量)。

+0

另一個有趣的問題是:靜態變量和靜態變量之間是否存在差異?我曾經讀過靜態變量不被線程緩存,所以用volatile來聲明一個靜態變量並不是真的有必要嗎?對此有何評論? – basZero 2014-04-09 12:03:27

+3

確實存在差異,並且從答案中推導出:每個類存儲一次「靜態」變量。每個類存儲一個「static volatile」變量_and_將被多個線程頻繁訪問,即讀取不能被緩存。 – 2014-04-09 18:15:42

相關問題