Java 两个线程并发修改HashMap

Java 两个线程并发修改HashMap,java,multithreading,hashmap,Java,Multithreading,Hashmap,若两个线程试图将(键、值)放入线程构造函数中传递的同一映射中。我可能会遇到什么样的线程问题 public class App { public static void main(String[] args) throws JMSException { Map<String, String> map = new HashMap<String, String>(); map.put("5", "fnc"); Threa

若两个线程试图将(键、值)放入线程构造函数中传递的同一映射中。我可能会遇到什么样的线程问题

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
        }
    }
}
公共类应用程序{
公共静态void main(字符串[]args)引发JMSException{
Map Map=newhashmap();
地图出售(“5”、“fnc”);
线程t1=newapp().newt(map);
线程t2=新的App().新的T(map);
t1.start();
t2.start();
}
T类扩展线程{
私人地图;
公共交通(地图){
this.map=map;
}
公开募捐{
//把100把钥匙放在地图上
地图放置(“1”、“abc”);
//把其他的钥匙放进去
}
}
}

映射将不是线程安全的。这意味着很少会发生这种情况

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

您可以使用ConcurrentHashMap来处理并发性


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

对Oracle HashMap实现的并发读写可能会导致挂起线程(由于底层实现的原因,很容易使其进入无限循环)。请参阅