标签:ConcurrentHashMap 欣赏 name Marker new marker return null 写法
文章目录
在阅读 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;
});
}
// ... 省略其余代码
}
标签:ConcurrentHashMap,欣赏,name,Marker,new,marker,return,null,写法 来源: https://blog.csdn.net/qq_30118563/article/details/122777319
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。