今天阅读Spring in Action第三版时遇到之前没看到过的Singleton模式的实现。
该实现称为 Initialization-on-demand holder idiom,其代码能实现Singleton模式并免除同步开销。
代码如下:
public class Something { private Something() { } private static class LazyHolder { private static final Something INSTANCE = new Something(); } public static Something getInstance() { return LazyHolder.INSTANCE; } }
当Something类被加载进JVM,由于其没有静态变量需要被初始化,类自身的初始化很快结束。类中声明的静态类LazyHolder直到JVM决定它
必须被执行时才会被初始化。当Something类的静态方法getInstance()被调用时LazyHolder才会被执行;当它第一次被执行时,JVM会加载并初始化之。
该过程中LazyHolder的静态成员变量INSTANCE会被初始化,从而Something的私有构造函数会被调用。
由于JLS,Java语言规范,规定并保证类的初始化是串行的(serial),即非并发的,所以,在对于静态的getInstance()方法额外的同步是不需要的。
后续对LazyHolder的静态变量INSTANCE将会得到同一个对象实例。
参考:http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom