线程安全的单例初始化
提前初始化
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 引用,并没有使用同步。