Java併發 - volatile/Holder與雙重空校驗

如下代碼摘選自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

  • volatile關鍵字的happens-before關係
  • volatile關鍵字的可見性問題
  • Java多線程的執行路徑問題, 及指令重排序的問題;
  • (有興趣的可自行查閱相關資料, 畢竟上述任意一個都是很是繁雜的話題)

這基本上能夠做爲最佳實踐放入本身項目中的多線程模塊中了, 在此僅作個記錄;框架

相關文章
相關標籤/搜索