【问题标题】:What happens when two threads try to modify/ access the same key in Concurrent HashMap?当两个线程尝试修改/访问 Concurrent HashMap 中的相同键时会发生什么?
【发布时间】:2016-07-23 08:29:43
【问题描述】:

我了解了 hashMap 以及它与 hashtable 的不同之处。就像在哈希表中一样,完整的对象被锁定,而在并发哈希映射的情况下,只有一部分被锁定。我的问题是,当两个线程同时尝试访问与键对应的相同值时会发生什么。

让我们说

 Map mp = new ConcurrentHashMap(); 
 mp.put(1, "Hello");

线程 1:尝试读取 mp.get(1)。

线程 2:尝试写入/修改 mp.put(1, "Hi")。

那么线程 1 读取什么值?

编辑:我的意思是 ConcurrentHashMap。

【问题讨论】:

  • Hello 或 Hi,取决于操作的顺序(假设映射是 ConcurrentHashMap,而不是 HashMap)。
  • 您是在询问同时使用的java.util.HashMap,还是java.util.concurrent.ConcurrentHashMap
  • 对不起,我的意思是 concurrentHashMap

标签: java multithreading hashmap concurrenthashmap


【解决方案1】:

线程 1 读取什么值?

它会读取两个可能的值

  • 它得到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 添加一个值。注意:此值只能使用一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多