以下代码摘选自Dubbo框架的ExtensionLoader
, 非常有趣:
/* ExtensionLoader */
@SuppressWarnings("unchecked")
public T getLoadedExtension(String name) {
if (name == null || name.length() == 0)
throw new IllegalArgumentException("Extension name == null");
Holder<Object> holder = cachedInstances.get(name);
if (holder == null) {
cachedInstances.putIfAbsent(name, new Holder<Object>());
holder = cachedInstances.get(name);
}
return (T) holder.get();
}
/* Just a volatile-helper */
public class Holder<T> {
private volatile T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
可以看到, 精华就是Holder-volatile
和双重null校验
的运用;
短短几句代码, 蕴含了:
- volatile关键字的
happens-before
关系 - volatile关键字的
可见性
问题 - Java多线程的执行路径问题, 及
指令重排序
的问题; - (有兴趣的可自行查阅相关资料, 毕竟上述任意一个都是非常繁杂的话题)
这基本上可以作为最佳实践
放入自己项目中的多线程模块
中了, 在此仅做个记录;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。