Java Lazy 单例

实现

维基百科里的实现方式:

1
2
3
4
5
6
7
8
9
10
11
public class Something {
private Something() {}

private static class LazyHolder {
static final Something INSTANCE = new Something();
}

public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}

解释

Java 加载内部类的机制是,当需要的时候再加载。在 Something::getInstance 被调用之前 LazyHolder 类是不会被加载的,因为不会被加载所以也不会被初始化。也所以 LazyHolder::INSTANCE 也不会存在的。

Something::getInstance 被调用时,先加载 LazyHolder 并及时初始化类 (也就是说初始化 LazyHolder::INSTANCE),然后访问 LazyHolder::INSTANCE

之后再次调用 Something::getInstance 时,直接访问已经初始化的 LazyHolder::INSTANCE

参考资料

Initialization-on-demand holder idiom

Does the Java ClassLoader load inner classes?