单例模式:懒汉式和饿汉式(个人理解)

懒汉式

/**
 * 懒汉式单例模式概念:
 *      不主动创建,在没有的情况下才会创建唯一实例,并且对象私有,构造私有
 */
public class SingletonLan {
    /**
     * 私有的对象
     *  加volatile 提供可见性
     *      所谓可见性,我的理解就是多个线程操作同一对象时,一旦对象发生改变,其余线程立马可见。
     *      并发情况下 ,此时A线程进入了双重检查锁去实例化对象
     *      线程B在锁外等候,线程A实例化完对象后往下执行,但是此时线程B是不知道线程A已经
     *      实例化出对象了,所有线程B会接着进同步锁去实例化,那就违背单例模式,所有需要
     *      加volatile关键字
     */
    private static volatile SingletonLan singletonLan = null;

    /**
     * 私有构造  防止被new 对象
     */
    private SingletonLan() {}

    /**
     * 对外暴露的获取实例
     * @return
     */
    public static SingletonLan getInstance(){
        //  双重检查锁
        if(singletonLan==null){
            //确认当前实例为空的情况下 进入锁
            synchronized (singletonLan.getClass()){
                /**
                 * 再在锁中确认此时只有一个线程进来 并且该线程实例为null  创建对象
                 *  (如果没有加锁 有多个线程同时进入这个if内去实例化对象 可能造成多个对象的生成 不符合单例模式)
                 */
                if (singletonLan == null){
                    singletonLan = new SingletonLan();
                }
            }
        }
        return singletonLan;
    }
}

饿汉式

/**
 * 饿汉式单例模式概念
 *      顾名思义,饿汉式比较着急,所有直接就会给出唯一实例,我称之为 白给
 *      注意 对象以及构造也都是私有
 */
public class SingletonHungry {
    /**
     * 私有且静态的对象
     *      类实例化时创建  线程安全
     */
    private final static SingletonHungry singleton = new SingletonHungry();

    /**
     * 私有构造 防止外部 new
     */
    private SingletonHungry(){}

    /**
     * 对外暴露的获取实例
     * @return
     */
    public static SingletonHungry getInstance(){
        return singleton;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值