并发哈希图的同步块

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。

您获得的是地图在以多线程方式使用时的吞吐量。