2011-12-16 128 views
3

內部類的實例我有一個靜態方法類似如下是靜態方法線程安全

public static void foo(){ 
    final ClassA a = new ClassA(); 
} 

我有內部CLASSA兩個哈希地圖。

那些哈希映射線程安全嗎?

+0

目前還不清楚這些地圖是如何使用和定義的。 HashMap不是線程安全的。但是看到併發哈希映射:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html – Adrian 2011-12-16 21:11:16

回答

0

目前還不清楚您是否想要訪問具有多個線程的對象a內的哈希映射,或是使用多個線程調用方法foo

在第一種情況下,集合的線程安全性與外部上下文無關,即它是在靜態上下文中創建的。因此,不,如果您嘗試訪問具有多個線程的對象a的散列映射,將導致意外的行爲。您需要使用​​塊管理對它們的訪問。

在第二種情況下,每個線程將在其堆棧上具有不同的foo副本並分配不同的ClassA實例。因此,他們不會相互碰撞,因爲他們會有不同的HashMaps

請說明您正在使用哪種情況。

0

HashMap不是線程安全的。

請注意,此實現不同步。如果多個線程訪問此地圖的同時,與線程中的至少一個結構上修改了地圖,它必須保持外部同步

然而,當你調用代碼foo你會得到一個新的ClassA每一次,所以兩個不同調用foo的線程將有權訪問ClassA的不同實例。假設ClassA中的hashmaps不是靜態或共享的,代碼應該正常工作。

+0

但是,新的操作原子? – chance 2011-12-16 08:54:59

0

您編寫代碼的方式將使您的靜態方法可用於所有線程,因此每個線程都將獲得您自己的類的對象。所以每個類都將擁有自己的哈希映射。

但是,如果你想爲所有線程使用相同的哈希映射,那就試試吧​​。

3

如果HashMapsclassA都是非靜態的(對於每一個新​​創造了新的),那麼你可以從多個線程調用foo並保證只有一個線程將通過HashMaps運行classA該線程創建的實例內。

1

我不同意(我錯過了什麼)?

在方法內部創建了一個新的ClassA實例。即使多線程訪問該方法,每個線程都會有一個唯一的HashMap可供使用。

如果ClassA是一個實例變量,它將會不同。另外,如果ClassA同時訪問地圖,則會出現線程問題。另外,如果地圖是靜態的,ClassA的多個實例將有權訪問它,並且是的,那將是有說服力的。

0

HashMap是不是線程安全的,但假設你從來沒有發佈實例a還是其兩個哈希地圖外foo(),則所有三個都侷限在一個線程,不必是線程安全的。

如果您確實發佈了a或其散列映射,或者散列映射是ClassA的靜態成員,則應確保線程安全。假設沒有包含哈希映射或其他一些狀態變量的不變量,您可以簡單地使用ConcurrentHashMap來完成此操作。如果存在這種不變量,則應該儘可能接近狀態變量,即在ClassA而不是foo()中進行同步。