当两个线程尝试修改/访问 Concurrent HashMap 中的同一个键时会发生什么?

Jav*_*est 3 java multithreading hashmap concurrenthashmap

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

可以说

 Map mp = new ConcurrentHashMap(); 
 mp.put(1, "Hello");
Run Code Online (Sandbox Code Playgroud)

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

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

那么线程 1 读取什么值?

编辑:我的意思是 ConcurrentHashMap。

Pet*_*rey 5

线程 1 读取什么值?

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

  • 它是null因为尚未设置该值。
  • 它获得线程 2 设置的值。

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

哪里ConcurrentHashMap是真正有用的是在这样的操作putIfAbsent对于在线程之间传递的工作,一个队列是更好的选择。

ConcurrentMap<Integer, BlockingQueue<String>> map = ...
Run Code Online (Sandbox Code Playgroud)

主题 1

String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();
Run Code Online (Sandbox Code Playgroud)

主题 2

map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,线程 1 将阻塞,直到线程 2 添加一个值。注意:此值仅可用一次。