说明
// 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