Java 懒汉单例模式

class Singleton{
    //volatile关键字禁止指令重排
    private volatile static Singleton instance;
    private Singleton(){}
    public Singleton getInstance(){
        if(instance==null){
            //对.class加锁,获得的是所有类对象的锁
            synchronized (Singleton.class){
                //双重检查,防止多个线程同时进入第一层检查(因单例模式只允许存在一个对象,故在创建对象之前无引用指向对象,所有线程均可进入第一层检查)
                //当某一线程获得锁创建一个Singleton对象时,即已有引用指向对象,singleton不为空,从而保证只会创建一个对象
                //假设没有第二层检查,那么第一个线程创建完对象释放锁后,后面进入对象也会创建对象,会产生多个对象
                if(instance==null){
                    //singleton=new Singleton语句为非原子性,实际上会执行以下内容:
                    //(1)在堆上开辟空间;(2)属性初始化;(3)引用指向对象
                    //volatile关键字可保证singleton=new Singleton()语句执行顺序为123,引用指向对象时一定有对象了
                }
            }
        }
        return instance;
    }
}

 饿汉式就是直接new出来

posted @ 2021-10-28 16:55  Kinghao0319  阅读(47)  评论(0)    收藏  举报