静态内部类实现的单例模式是如何保证线程安全的

静态内部类实现的单例模式如下:

public class Singleton {
    private Singleton(){
        
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.sInstance;
    }
    
    private static class SingletonHolder{
        private static final Singleton sInstance = new Singleton();
    }

}

//当第一次加载Singleton类时并不会初始化sInstance,只有在第一次调用Singleton的getInstance方法时才会导致sInstance被初始化。
//因此第一次调用getInstance方法会导致虚拟机加载SingletonHolder类,
//这种方式不仅能够确保线程安全,也能保证单例对象的唯一性,同时延迟了单例的实例化。

//这种方式不仅能够确保线程安全

//原因:虚拟机会保证一个类的构造器<clinit>()方法在多线程环境中被正确地加载,同步,如果多个线程同时去初始化一个类,那么只有一个线程去执行这个类的
//构造器<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。

猜你喜欢

转载自blog.csdn.net/yao_94/article/details/82764741
今日推荐