ConcurrentHashMap 原子操作的写法欣赏

文章目录


在阅读 slf4j 源码的时候,发现 BasicMarkerFactory的一个方法实现很有典型意义: 恰好说明了在使用减少
锁争用/CAS的一个技巧.

public class BasicMarkerFactory implements IMarkerFactory {
    private final ConcurrentMap<String, Marker> markerMap = new ConcurrentHashMap<String, Marker>();
    public BasicMarkerFactory() {
    }
    /**
     * Manufacture a {@link BasicMarker} instance by name. If the instance has been 
     * created earlier, return the previously created instance. 
     * 
     * @param name the name of the marker to be created
     * @return a Marker instance
     */
    public Marker getMarker(String name) {
        if (name == null) {
            throw new IllegalArgumentException("Marker name cannot be null");
        }

        /** it really is amazing!!!*/
        Marker marker = markerMap.get(name);
        if (marker == null) {
            marker = new BasicMarker(name);
            // two threads may simultaneously putIfAbsent() ,and only one of them succeeds
            Marker oldMarker = markerMap.putIfAbsent(name, marker);
            if (oldMarker != null) {
                marker = oldMarker;
            }
        }
        return marker;
    }
    
     // 下面这个是笔者加的,当然也能玩...但其实并没有上面的性能好. 但是话说回来,绝大多数场景下, 似乎也够用了..
    // both this one and the one above have the same semantics, while this one will has more race condition
    public Marker myGetMarker(String name) {
        if (name == null) {
            throw new IllegalArgumentException("Marker name cannot be null");
        }
        
        return markerMap.compute(name, (markerName, marker) -> {
            if (marker == null) {
                marker = new BasicMarker(markerName);
            }
            return marker;
        });
    }
	// ... 省略其余代码
}
上一篇:UOJ552 【UNR #4】同构判定鸭【线性代数,哈希】


下一篇:求DAG上两点的最短距离