并发哈希图的同步块
synchronised block for concurrent hashmap
当使用并发哈希图时,我是否需要将 put 包裹在同步块周围,是否有可能出现竞争条件:
synchronized(lock) {
if(this.map.get(id) != null) {
throw new Exception();
}
this.map.put(id, number);
return true;
}
当使用 ConcurrentHashMap 时,你不应该像上面的例子那样同步。
通过在地图上同步,您正在失去使用 ConcurrentHashMap 的好处,它不会为每次访问锁定整个 table。
在你的情况下你应该做的是使用原子操作putIfAbsent。
您获得的是地图在以多线程方式使用时的吞吐量。
当使用并发哈希图时,我是否需要将 put 包裹在同步块周围,是否有可能出现竞争条件:
synchronized(lock) {
if(this.map.get(id) != null) {
throw new Exception();
}
this.map.put(id, number);
return true;
}
当使用 ConcurrentHashMap 时,你不应该像上面的例子那样同步。
通过在地图上同步,您正在失去使用 ConcurrentHashMap 的好处,它不会为每次访问锁定整个 table。
在你的情况下你应该做的是使用原子操作putIfAbsent。
您获得的是地图在以多线程方式使用时的吞吐量。