当前位置 > it书童 > java > 正文

静态内部类实现单例模式

java it书童 2020-12-26 20:14:14 0赞 0踩 92阅读 0评论

public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {
    }

    private static class InnerClass {
        private static final StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance() {
        return InnerClass.staticInnerClassSingleton;
    }
}

这种方式的优点是:

  • 不用 synchronized,节省时间

  • 调用 getInstance() 的时候才会创建对象,不调用不创建,节省空间

为什么这种方式是线程安全的?

虚拟机会保证一个类的 clinit() 方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只有一个线程去执行这个类的 clinit() 方法,其他线程都需要阻塞等待,直到活动线程执行 clinit() 方法执行完毕。如果在一个类的 clinit() 方法中有耗时很长的操作,就可能导致多个线程阻塞

详细可参考 https://www.jianshu.com/p/ef263cf7f7f9

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/1010