【java】单例模式双重检验锁

导读:本篇文章讲解 【java】单例模式双重检验锁,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

说明

// 1.双重检验,单例模式,懒汉式,保证线程安全

实现

// #.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 (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://www.bmabk.com/index.php/post/92355.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!