当两个线程试图修改/访问 Concurrent HashMap 中的同一个键时会发生什么?
What happens when two threads try to modify/ access the same key in Concurrent HashMap?
我了解了 hashMap 以及它与哈希表的区别。就像在哈希表中一样,整个对象都被锁定,而在并发哈希表的情况下,只有一部分被锁定。我的问题是当两个线程试图在同一时间访问对应于一个键的相同值时会发生什么。
假设
Map mp = new ConcurrentHashMap();
mp.put(1, "Hello");
线程 1:正在尝试读取 mp.get(1)。
线程 2:正在尝试 write/modify 进入其中 mp.put(1, "Hi").
那么线程 1 读取什么值?
编辑:我的意思是 ConcurrentHashMap。
What value does thread 1 gets to read?
它将读取两个可能的值,
- 它得到
null
,因为尚未设置该值。
- 它获取线程 2 设置的值。
这听起来可能没什么大不了的,但您应该注意,使用 HashMap
可能会进入无限循环,而永远不会 return,这很糟糕。
ConcurrentHashMap
真正有用的地方是在像 putIfAbsent
这样的操作中为了在线程之间传递工作,队列是更好的选择。
ConcurrentMap<Integer, BlockingQueue<String>> map = ...
线程 1
String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();
线程 2
map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");
在这种情况下,线程 1 将阻塞,直到线程 2 添加了一个值。注意:此值只能使用一次。
我了解了 hashMap 以及它与哈希表的区别。就像在哈希表中一样,整个对象都被锁定,而在并发哈希表的情况下,只有一部分被锁定。我的问题是当两个线程试图在同一时间访问对应于一个键的相同值时会发生什么。
假设
Map mp = new ConcurrentHashMap();
mp.put(1, "Hello");
线程 1:正在尝试读取 mp.get(1)。
线程 2:正在尝试 write/modify 进入其中 mp.put(1, "Hi").
那么线程 1 读取什么值?
编辑:我的意思是 ConcurrentHashMap。
What value does thread 1 gets to read?
它将读取两个可能的值,
- 它得到
null
,因为尚未设置该值。 - 它获取线程 2 设置的值。
这听起来可能没什么大不了的,但您应该注意,使用 HashMap
可能会进入无限循环,而永远不会 return,这很糟糕。
ConcurrentHashMap
真正有用的地方是在像 putIfAbsent
这样的操作中为了在线程之间传递工作,队列是更好的选择。
ConcurrentMap<Integer, BlockingQueue<String>> map = ...
线程 1
String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();
线程 2
map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");
在这种情况下,线程 1 将阻塞,直到线程 2 添加了一个值。注意:此值只能使用一次。