繁体   English   中英

当两个线程尝试修改/访问 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:尝试写入/修改 mp.put(1, "Hi")。

那么线程 1 读取什么值?

编辑:我的意思是 ConcurrentHashMap。

线程 1 读取什么值?

它将读取两个可能的值,要么

  • 由于尚未设置该值,因此它会变为null
  • 它获得线程 2 设置的值。

这听起来可能不是很多,但您应该注意,使用HashMap可能会进入无限循环并且永远不会返回,这很糟糕。

ConcurrentHashMap真正有用的地方是在putIfAbsent类的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 添加一个值。 注意:此值仅可用一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM