文章目录
在阅读 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;
});
}
// ... 省略其余代码
}