如下代码摘选自Dubbo框架的ExtensionLoader
, 很是有趣:java
/* 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校验
的运用;多线程
短短几句代码, 蕴含了:app
happens-before
关系可见性
问题指令重排序
的问题;这基本上能够做为最佳实践
放入本身项目中的多线程模块
中了, 在此仅作个记录;框架