如果一個類的靜態變量只佔用一個內存位置,它是由進程的所有線程共享的嗎?或者是爲每個正在運行的線程創建的這種變量的一個內存位置?一個靜態變量對所有正在運行的線程只取一個內存位置嗎?
此外,如果所有線程共享相同的內存位置,我們如何確保互斥?
如果一個類的靜態變量只佔用一個內存位置,它是由進程的所有線程共享的嗎?或者是爲每個正在運行的線程創建的這種變量的一個內存位置?一個靜態變量對所有正在運行的線程只取一個內存位置嗎?
此外,如果所有線程共享相同的內存位置,我們如何確保互斥?
A static
一個進程中的class
變量將在該進程中包含的每個線程之間共享。
您可以通過創建一個帶有public static
字段的簡單class
來驗證此問題,然後啓動一對Threads
並讓它們遞增變量並查看會發生什麼。
如果您想確保互斥,您可以將變量設置爲私有,並且只允許通過使用關鍵字定義的方法對其進行訪問。
class Foo {
private static int aVariable = 0;
public static synchronized void increment() { aVariable++; }
public static synchronized int getVariable() { return aVariable; }
}
它的線程之間共享,你可以通過變量本身私有的,只能使用一個同步的訪問訪問它確保相互排斥。
靜態字段由所有線程共享。 JVM中只有一個字段副本。
要控制對靜態字段的訪問,可以使用同步關鍵字或使用JDK 5.0提供的concurrency utilities。
有一種方法可以創建一個變量,每個線程有一個實例,請參閱ThreadLocal。
是由規格說明還是隻有某些JVM如何做? – 2010-01-27 15:42:24
線程的本質是共享內存。它在語言中指定。雖然我沒有提及它。 – jjnguy 2010-01-27 15:43:30