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

标签 java multithreading hashmap concurrenthashmap

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

让我们说

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

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

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

那么线程 1 读取什么值?

编辑:我的意思是 ConcurrentHashMap。

最佳答案

What value does thread 1 gets to read?

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

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

关于java - 当两个线程尝试修改/访问 Concurrenthashmap 中的同一个键时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36391799/

相关文章:

java - 如何删除父对象而不删除子对象?

java - 来自 Thread 的警报对话框 - Android

java - 如何清除要进行垃圾收集的对象(HashMap)-Java

c++ - 使用大型整数对数据集有效地初始化 unordered_map

java - 网域。 SSL。我是否需要服务器证书才能启用 key 加密 KeyUsage?

java - JSF 性能限制

multithreading - XSLT 处理器可以是多线程的吗?

python - 如何以编程方式停止 multiprocessing.Pool 映射函数

ruby - 在 ruby​​ 哈希中交换 key

java - Java while循环不适用于字符的输入检查