两个线程同时修改HashMap

时间:2014-03-01 04:09:42

标签: java multithreading hashmap

如果两个线程试图将(key,value)放在线程构造函数中传递的同一个map中。我可能会遇到什么样的线程问题?

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
        }
    }
}

2 个答案:

答案 0 :(得分:0)

地图不会是线程安全的。这意味着很少有情景发生

1)线程1试图从密钥中检索条目,而线程2试图在该时刻修改条目。 2)反之亦然。

  

您可以使用ConcurrentHashMap来实现处理并发的目的。

答案 1 :(得分:0)

一个例子:当线程1放置一个值时,线程2决定增加哈希表容量。在这种情况下,线程1可以将其值放入旧的哈希表,并且线程2可以用新的哈希表覆盖该哈希表。线程1放置丢失。