2014-03-01 23 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来处理并发性。