Java 当两个线程试图修改/访问并发HashMap中的同一个键时会发生什么情况?
我阅读了hashMap以及它与hashtable的区别。与hashtable中一样,整个对象被锁定,而对于并发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
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