1. 首页
  2. 编程面试题
  3. Java
  4. 设计模式

单例设计模式--懒汉式(加双检锁模式)



基本与上一篇的类似,不同的是加锁方式有区别


package instance;

import java.io.Serializable;

public class SingleTon implements Serializable {
    // 饿汉模式,构造方法必须私有,才能保证构造方法只有本类能够使用
    private SingleTon(){
//        if (instance!=null){
//            throw new RuntimeException("单例对象不能重复创建");
//        }
        System.out.println("构造方法执行了,创建单例对象");
    }
    // 私有构造内部可以调用,创建实例,必须加valatile
    private static volatile SingleTon instance = null;

    // 获取实例方法
    public static SingleTon getInstance() {
        if (instance==null){
            synchronized(SingleTon.class){
                if (instance==null){
                    instance =  new SingleTon();
                }
            }
        }
        return instance;
    }

}

双检锁模式也可以创建单例对象,需要加两个if(instalce==null)判断和volatile关键词

**为什么内层也需要加if判断?**
如果不加的话,可能在线程A return instance 之前线程B就创建了对象,这样就产生了2个对象

**为什么要加volatile关键词?**
这个问题比较复杂,volatile解决对象创建的可见性和有序性,因为计算机执行命令存在指令重排,对于对象的创建指令有(初始化分配内存空间、执行构造方法、执行成员变量赋值),如果不加volatile关键词,可能导致线程A创建了一个正常对象后,线程B创建的对象只分配了内存和执行构造方法,并没有给对象赋值,没赋值的话线程B创建的对象可能是残缺不完整的,就跟线程A创建的对象不一致,所以必须要加volatile关键词


构造方法执行了,创建单例对象
instance.SingleTon@67424e82
instance.SingleTon@67424e82

发布者:admin,如若转载,请注明出处:https://ai1024.vip/38642.html

QR code
//