【发布时间】:2019-05-06 22:56:35
【问题描述】:
我知道 ConcurrentHashMap 方法是线程安全的,但是对于非原子的复合操作,例如查看这段代码 - 如果 2 个不同的线程同时使用相同的“myKey”调用它,那是不可能的竞争条件发生?
myMap 是一个 ConcurrentHashMap
myValues = myMap.get(myKey);
if (myValues == null) {
myValues = new List()
myMap.add(myKey, myValues);
}
myValue.add(new list item);
如何以线程安全的方式编写上述内容,仅使用 ConcurrentHashMap 和不使用单独的锁等,
putIfAbsent 似乎也没有解决问题,或者类似这样可行:
myValues = myMap.putIfAbsent(myKey, new List());
myValues.add(new list item);
这是否正确且线程安全?
谢谢
【问题讨论】:
-
无论您如何处理
ConcurrentHashMap,您都试图同时从多个线程追加到同一个列表。仅仅因为列表恰好是ConcurrentHashMap中的一个值,这并不安全。
标签: java concurrency concurrenthashmap