提问者:小点点

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


我读过关于hashMap以及它与hashtable的不同之处。就像在hashtable中一样,完整的对象被锁定,而在并发hashmap的情况下,只有一部分被锁定。我的问题是,当两个线程试图在samme时间访问与键对应的相同值时会发生什么。

让我们说

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

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

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

那么线程1可以读取什么值?

编辑:我的意思是并发HashMap。


共1个答案

匿名用户

线程1可以读取什么值?

它将读取两个可能的值

  • 它得到null,因为值尚未设置。
  • 它获取线程2设置的值。

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

ConCurrentHashMap真正有用的地方是在putIfAbsend等操作中对于在线程之间传递工作,Queue是更好的选择。

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添加了一个值。注意:此值仅可用一次。