繁体   English   中英

ConcurrentHashMap put() 方法可以不是线程安全的吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM