如下代碼摘選自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
關係可見性
問題指令重排序
的問題;這基本上能夠做爲最佳實踐
放入本身項目中的多線程模塊
中了, 在此僅作個記錄;框架