并发hashmap不需要同步的getter / setter吗?
如果我使用并发hashmap并且我有设置和获取值的方法,因为我使用并发hashmap我需要使getter和setter同步吗? 这是多余的吗? 一种设计更好吗?
另外,没有同步的并发hashmap比具有synchronized getter和setter的hashmap更快吗? 这是一个高性能系统
谢谢
-
java.util.concurrent.ConcurrentHashMap
是线程安全的 - 它比使用
synchronized(object)
更快 -
您还需要注意不要通过这样的代码创建“逻辑”竞争条件
if (map.get(key) != null) { map.put(key, new SomethingStrictlyUnique()); }
-
根据经验,将同步集合替换为并发集合可以提供显着的可伸缩性改进,而风险很小。
-
根据javadoc ,ConcurrentHashMap返回的迭代器是“弱一致的”(而不是fail-fast),所以它们容忍并发修改,遍历构造迭代器时存在的元素,并且可能反映出构造后对集合的修改。迭代器。
1)如果你只有一个操作的getter和setter方法(比如get方法只返回给定键的映射值)或任何线程安全操作,那么你不需要为这些getter显式同步块&setter。
2)是的,使用没有synchronized块的并发hashmap将大大提高性能。
注意:ConcurrentHashMap是弱一致的,在大多数情况下是可以接受的。
- ConcurrentHashMap锁定
- ConcurrentHashMap中的读操作关于返回值是否可靠?
- “在Java 8中构建时,未定义的引用:.. ConcurrentHashMap.keySet()”
- ConcurrentHashMap.get()是否保证通过不同的线程看到以前的ConcurrentHashMap.put()?
- ConcurrentHashMap JDK 8何时使用computeIfPresent
- ConcurrentHashMap返回一个弱一致的迭代器,为什么我们应该使用它呢?
- ConcurrentHashMap构造函数参数?
- 同步局部变量
- 使用ConcurrentHashMap,何时需要同步?