[英]Can ConcurrentHashMap put() method be not thread-safe?
假设我有一个名为 map 的共享 ConcurrentHashMap<String, Integer> 已经只有一个映射(“One”,1),并且还假设我有 2 个线程。
第一个线程执行以下代码:
map.put("One", 2);
第二个线程执行以下代码:
synchronized (map) {
Integer number = map.get("One");
System.out.println(number == map.get("One"));
}
由于 ConcurrentHashMap 使用锁定条带方法而不是锁定整个 object 我不认为所描述的场景是线程安全的。 特别是我不知道是否可能存在map.put("One", 2);
的交错。 在 Integer 之间的第一个线程Integer number = map.get("One");
调用和System.out.println(number == map.get("One"));
尽管两个线程都在同步块内,但仍调用第二个线程。
那么该代码是否有可能打印错误?
ConcurrentHashMap
中的所有方法都可能是线程安全的,但这并不意味着它在ConcurrentHashMap
object 本身上同步。 您可以做的是在同一参考上同步put
和 map 访问代码。 您的put
代码必须更改为:
synchronized (map) {
map.put("One", 2);
}
您的访问代码可以保持如下:
synchronized (map) {
Integer number = map.get("One");
System.out.println(number == map.get("One"));
}
这将永远无法打印false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.