2014-06-19 123 views
1

我正在使用兩個線程將值放在同一個哈希映射中。線程1將讀取它存儲的值,線程2將只讀取它存儲在地圖中的值。哈希映射中的線程問題

在那我得到NullPointerException。是由於線程問題?

HashMap map = new HashMap(); 

    Thread1: 

      map.put(1,1); 
      map.put(2,2); 
      map.get(1).toString(); // here null pointer i am getting.. Is it possible due to threading issue.. 

    Thread 2: 
     map.put(4,4); 
     map.put(5,5) 
+0

我沒有看到它可以在任何情況下返回'null'與張貼的代碼,請添加代碼,可以重現此錯誤 –

+0

請追加您的整個源代碼和異常stacktrace,心靈讀書尚未發明。 – Smutje

+0

我在我的生產環境中得到錯誤..並且我有更多的java文件.. – user2641906

回答

2

@Dylan是正確的,簡短的回答是你不應該在併發環境中使用HashMaps。幸運的是,java.util.concurrent.ConcurrentHashMap來救援。

+0

是的......我不想使用ConcurrentHashMap。這是爲了避免鎖定開銷。 – user2641906

+0

ConcurrentHashMap在儘可能避免鎖定開銷方面做得非常好。它鎖定了Map的部分內容,而不是整個內容。如果您優化CHM的大小並仔細設計(設置負載因子和貨幣級別),您應該具有非常低的碰撞率。 – ticktock

3

有2個解決方案

1)使用java.util.ConcurrentHashMap,其被設計成在螺紋enviornment進行操作。

2)同步散列圖。 Java允許您在對象上進行同步,因此您可以確保只有一個線程同時觸及對象。

ex。

synchronized(map) { 
    map.put("important", "stuff"); 
} 

方法#2是不是多線程的首選解決方案(CuncurrentHashMap是),但你唯一的選擇,如果你不能改變(在大型項目等)的變量的類型。