2011-05-12 63 views
2

是靜態的變量是線程特定的,意味着靜態變量是java中的線程特定的嗎?

class A { 
    public static int i = 10; 
} 

Class B { 
    A.i = 20; 
} 

Class C { 
    A.i = 30; 
} 

Class D { 
    System.out.println(A.i); 
} 

以上班我從我的web應用程序,即在第一次請求調用我稱之爲B級,在第二次請求我把B類和第三請求我呼籲D類現在打印什麼10/20/30?

謝謝。

+4

你的示例代碼甚至不編譯相同的值。請向我們顯示編譯代碼。 – 2011-05-12 12:14:55

+2

我不認爲編譯需要的示例代碼。人們發佈精簡版代碼並不罕見。重要的是,你能夠很好地瞭解他們正在嘗試做什麼。在這種情況下,你可以。 – 2011-05-12 14:12:32

回答

3

對於你的問題的正確答案(它會打印10/20/30?),假設每個請求都可能由不同的線程處理,則爲「是」。

邏輯上,如果每個請求按時間順序發生順序,每一個不同的線程,那麼你會看到20(該值不是線程專用的,我覺得你問的),但要注意,即使調用d發生時間順序最後,它仍然可以看到值'10';該字段既不是最終的也不是波動的瓷磚,所以Java內存模型不作任何時候變到20將是其他線程可見的保證。

1

沒有,他們是加載的類具體

1

靜態變量是全局的,跨線程共享。這意味着,在你的榜樣(B - 「ç - > d)d將打印30(僅當他們被稱爲依次

這對同步你可能想知道的一些問題...

0

靜態變量是全局性的,這意味着,無論你想和變量將有您分配給it.In的方法最終值,如果變量是私有的,你做出改變,但該方法的變量,你可以對他們的改變將具有該代碼的方法的calculate.Eventually之前會告訴你30