Java 当两个线程试图修改/访问并发HashMap中的同一个键时会发生什么情况?

Java 当两个线程试图修改/访问并发HashMap中的同一个键时会发生什么情况?,java,multithreading,hashmap,concurrenthashmap,Java,Multithreading,Hashmap,Concurrenthashmap,我阅读了hashMap以及它与hashtable的区别。与hashtable中一样,整个对象被锁定,而对于并发hashmap,只有部分对象被锁定。我的问题是,当两个线程试图同时访问与一个键对应的相同值时,会发生什么情况 比方说 Map mp = new ConcurrentHashMap(); mp.put(1, "Hello"); 线程1:尝试读取mp.get(1) 线程2:尝试将mp.put(1,“Hi”)写入/修改到它中 那么线程1可以读取什么值呢 编辑:我是指Concurrent

我阅读了hashMap以及它与hashtable的区别。与hashtable中一样,整个对象被锁定,而对于并发hashmap,只有部分对象被锁定。我的问题是,当两个线程试图同时访问与一个键对应的相同值时,会发生什么情况

比方说

 Map mp = new ConcurrentHashMap(); 
 mp.put(1, "Hello");
线程1:尝试读取mp.get(1)

线程2:尝试将mp.put(1,“Hi”)写入/修改到它中

那么线程1可以读取什么值呢

编辑:我是指ConcurrentHashMap

线程1读取什么值

它将读取两个可能的值

  • 由于尚未设置值,因此它将获得
    null
  • 它得到了thread2设置的值
这听起来可能不是很多,但您应该注意,使用
HashMap
可以进入无限循环,并且永远不会返回,这是不好的

ConcurrentHashMap
putIfAbsent
这样的操作中非常有用时,对于在线程之间传递工作,队列是更好的选择

ConcurrentMap<Integer, BlockingQueue<String>> map = ...
ConcurrentMap=。。。
线程1

String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();
String value=map.putIfAbsent(1,k->newblockingqueue()).take();
线程2

map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");
map.putIfAbsent(1,k->newblockingqueue()).offer(“Hi”);

在这种情况下,线程1将阻塞,直到线程2添加了一个值。注意:此值仅可用一次。

您好或您好,具体取决于操作的顺序(假设映射是ConcurrentHashMap,而不是HashMap)。您是询问并发使用的
java.util.HashMap,还是询问
java.util.concurrent.ConcurrentHashMap
?对不起,我是指ConcurrentHashMap