一个免除同步开销的Singleton模式 实现

今天阅读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

你可能感兴趣的:(一个免除同步开销的Singleton模式 实现)