双重校验锁

// #.final修饰,避免子类继承,覆盖父类方法,破坏单例
public final class Singleton implements Serializable{
	// #.私有构造方法,避免被外面使用,但无法避免反射构造实例
    private Singleton(){}
	// #.volatile修饰避免指令重排序,读写屏障
    private static volatile Singleton instance;
    
    public static Singleton getInstance(){
    	//#.第一个if判断是否为空,不为空直接返回,避免synchronized同步代码块的执行,多线程场景下频繁加锁会影响性能
        if(instance == null){
        	// 首次访问会同步,之后的使用没有synchronized
            synchronized (Singleton.class){
            	// #.第二个if判断是否为空,当a线程优先获得锁,执行到此处,b线程没竞争到锁会被阻塞在外面,a线程判断实例是否为空,为空则new实例,a线程释放锁之后,b线程拿到锁进来后判断instance是否为null,此时不为null,则释放锁往下
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    // 如果实现了序列化接口,加这个方法来防止反序列化破坏单例
    public Object readResolve(){
    	return instance;
	}
}

//来源:https://blog.csdn.net/qq_32088869/article/details/128027274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522e642c041a9bc656f353a06a569d23212%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=e642c041a9bc656f353a06a569d23212&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-128027274-null-null.nonecase&utm_term=%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4450

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务