线程安全的单例初始化

提前初始化

public class ResourceLoader {

    private static Resource resource = new Resource();

    public static Resource getResource() {
        return resource;
    }

}

懒初始化

public class ResourceLoader {

    private static class ResourceHolder {
        public static Resource resource = new Resource();
    }

    public static Resource getResource() {
        return ResourceHolder.resource;
    }

}

不建议使用的DCL

DCL声称能实现两全其美——在常见代码路径上的延迟初始化中不存在同步开销。它的工作原理是,首先检查是否在没有同步的情况下需要初始化,如果resource引用不为空,那么就直接使用它。否则,就进行同步并再次检查Resource是否被初始化,从而保证只有一个线程对共享的Resource执行初始化。在常见的代码路径中——获取一个已构造好的Resource 引用,并没有使用同步。

posted @ 2023-02-21 17:45  OraCat  阅读(22)  评论(0编辑  收藏  举报