单例模式的写法(保证线程安全)

单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例单例模式具体的实现方式, 分成 "饿汉" 和 "懒汉" 两种.

饿汉(天然就是安全的 只是读操作)

//单例模式(饿汉)
    //天然就是安全的 只是读操作

    // 把单例这个类设置成的
class Singleton {
    // 唯一实例的本体
    private static Singleton instance = new Singleton();


    // 获取到实例的方法
    public static Singleton getInstance() {
        return instance;
    }


    //禁止外部 new 实例 此处 在类的内部把实例创建好同时禁止外部重新创建实例 此时就保证单例的特性了
    // private是类外部不能用
    private Singleton() {  }
}


public class ThreadDemo15 {
    public static void main(String[] args) {
        // 此时 s1 和s2 是同一个对象
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

    }
}

懒汉(不安全的 有读有写)


//通过懒汉模式实现单例模式
    //不安全的 有读有写
    //如何保证安全?
    //1.加锁 把if和new变成原子操作
    //2.双重if,减少不必要的加锁操作
    //3.使用volatile 禁止指令重排序,保证后续线程肯定拿到的是完整对象
class SingletonLazy {
    private static SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        //这个条件,判定是否要加锁,此时如果对象已经有了,就不必加锁了此时本身就是线程安全了
        if(instance == null) {
            synchronized (SingletonLazy.class) {


                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() { }
}



public class ThreadDemo16 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1==s2);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值