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多线程的执行路径问题, 及指令重排序的问题;
  • (有兴趣的可自行查阅相关资料, 毕竟上述任意一个都是很是繁杂的话题)

这基本上能够做为最佳实践放入本身项目中的多线程模块中了, 在此仅作个记录;框架

相关文章
相关标签/搜索