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



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

比方说

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

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

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

那么线程1读取的值是多少?

编辑:我指的是ConcurrentHashMap。

线程1读取的值是多少?

它将读取两个可能的值,任一

  • 它得到CCD_ 1,因为该值还没有被设置
  • 它得到Thread 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添加了一个值。注意:此值仅可用一次。

相关内容

最新更新