代码如下
/** * * @ClassName: SingletionStaticInner * @Description: TODO【单例模式之最优解】 * @author shundong.wu * @date 2019年2月12日 * 线程安全 */ class SingletonStaticInner { private SingletonStaticInner() { } private static class SingletonInner { private static SingletonStaticInner singletonStaticInner = new SingletonStaticInner(); } public static SingletonStaticInner getInstance() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return SingletonInner.singletonStaticInner; } }
为何说是最优解呢?
可以看到使用这种方式我们没有显式的进行任何同步操作,那他是如何保证线程安全呢?和饿汉模式一样,是靠JVM保证类的静态成员只能被加载一次的特点,这样就从JVM层面保证了只会有一个实例对象。那么问题来了,这种方式和饿汉模式又有什么区别呢?不也是立即加载么?实则不然,加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
——————————————————新年快乐——————————————
来吧 来吧 作者学粗才浅 尽管骚扰【邮箱 shundong106@icloud.com】