如果我使用并发哈希图并且我有设置和获取值的方法,因为我使用并发哈希图我需要使 getter 和 setter 同步吗?这是多余的吗?一种设计更好吗?
此外,没有同步的并发 hashmap 是否比具有同步 getter 和 setter 的 hashmap 快?这是一个高性能系统
谢谢
如果我使用并发哈希图并且我有设置和获取值的方法,因为我使用并发哈希图我需要使 getter 和 setter 同步吗?这是多余的吗?一种设计更好吗?
此外,没有同步的并发 hashmap 是否比具有同步 getter 和 setter 的 hashmap 快?这是一个高性能系统
谢谢
java.util.concurrent.ConcurrentHashMap
是线程安全的synchronized(object)
您仍然需要注意不要通过这样的代码创建“逻辑”竞争条件
if (map.get(key) != null) {
map.put(key, new SomethingStrictlyUnique());
}
根据经验,用并发集合替换同步集合可以提供显着的可伸缩性改进,并且风险很小。
根据javadoc, ConcurrentHashMap 返回的迭代器是“弱一致的”(而不是快速失败),因此它们容忍并发修改,遍历构造迭代器时存在的元素,并可能反映构造后对集合的修改迭代器。
1) 如果你的 getter 和 setter 方法只执行一个操作(比如 get 方法只会返回给定键的映射值)或任何线程安全操作,那么你不需要为这些 getter 显式同步块&二传手。
2)是的,使用没有同步块的并发hashmap将大大提高性能。
注意:ConcurrentHashMap 是弱一致的,这在大多数情况下是可以接受的。