【发布时间】:2025-11-21 02:10:01
【问题描述】:
Hashtable 和 Collections.synchronizedMap 是线程安全的,但仍然是复合操作,例如
if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}
需要外部同步为:
synchronized(map_obj) {
if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}
}
假设我们有 ConcurrentHashMap(CHM) 而不是 Hashtable 或 HashMap。 CHM为上述复合操作提供了另一种putIfAbsent()方法,从而无需外部同步。
但假设 CHM 没有提供putIfAbsent()。那么我们可以编写如下代码:
synchronized(concurrenthashmap_obj) {
if (!concurrenthashmap_obj.containsKey(key)) {
concurrenthashmap_obj.put(key, value);
}
}
我的意思是我们可以在 CHM 对象上使用外部同步吗?它会工作吗?
对于上述复合操作,CHM 中有putIfAbsent() 方法,但是如果我们使用 CHM,我们如何实现其他复合操作的线程安全。我的意思是我们可以在 CHM 对象上使用外部同步吗?
【问题讨论】:
标签: java collections thread-safety