2014-03-01 51 views
1

如果兩個線程嘗試將(鍵,值)放入同一個映射中傳遞給線程的構造函數。我可能遇到什麼樣的線程問題?由兩個線程併發修改HashMap

public class App { 
    public static void main(String[] args) throws JMSException { 
     Map<String, String> map = new HashMap<String, String>(); 
     map.put("5", "fnc"); 

     Thread t1 = new App().new T(map); 
     Thread t2 = new App().new T(map); 
     t1.start(); 
     t2.start(); 
    } 

    class T extends Thread { 

     private Map<String, String> map; 

     public T(Map<String, String> map) { 
      this.map = map; 
     } 

     public void run() { 
      // put 100s of keys in map here 
      map.put("1", "abc"); 
      // put other keys 
     } 
    } 
} 
+0

對Oracle HashMap實現的併發讀取和寫入操作可能會導致掛起的線程(由於底層實現,很容易使其陷入無限循環)。請參閱http://stackoverflow.com/a/1068213/83695 – andersoj

回答

0

一個示例:在線程1放置一個值時,線程2決定增加哈希表容量。在這種情況下,線程1可能會將其值添加到舊的哈希表中,並且線程2可能會用新的哈希表覆蓋該哈希表。線程1丟失。

0

地圖將不會線程安全。這意味着幾個場景不會發生

1)線程1嘗試從密鑰中檢索條目,並嘗試在該時刻修改條目的線程2。 2)反之亦然。

您可以使用ConcurrentHashMap來處理併發性。