我了解了 hashMap 以及它与哈希表的区别。就像在哈希表中一样,整个对象都被锁定,而在并发哈希表的情况下,只有一部分被锁定。我的问题是当两个线程同时尝试访问对应于一个键的相同值时会发生什么。
让我们说
Map mp = new ConcurrentHashMap();
mp.put(1, "Hello");
线程 1:尝试读取 mp.get(1)。
线程 2:尝试向其中写入/修改 mp.put(1, "Hi")。
那么线程 1 读取什么值?
编辑:我的意思是 ConcurrentHashMap。
最佳答案
What value does thread 1 gets to read?
它将读取两个可能的值,要么
- 它得到
null
,因为尚未设置该值。 - 它获取线程 2 设置的值。
这听起来可能不是什么好事,但您应该注意,使用 HashMap
可能会进入无限循环并且永远不会返回,这很糟糕。
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 添加了一个值。注意:此值仅可用一次。
关于java - 当两个线程尝试修改/访问 Concurrenthashmap 中的同一个键时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36391799/