单例模式的三种实现方式

1.赖汉式

顾名思义,当我需要某个类时,才去判断它是否存在,不存在才创建,存在则直接返回。

代码实现:代码比较简单,就不写注释了。

/**
 * @filename LHan
 * @description 赖汉模式
 * @date 2020/12/24 13:57
 */
public class LHan {
	private static LHan han;

	private LHan(){}

	public static LHan getLHan(){
		if (han == null){
			return new LHan();
		}
		return han;
	}

}

2.饿汉式

顾名思义,当我需要用到某个类时,不管这个类的实例有没有有被创建,我都会自己创建一个新的实例并返回。

代码实现:

package com.market.design.single;

/**
 * @filename EHan
 * @description 饿汉试
 * @date 2020/12/24 14:38
 */
public class EHan {
	private static EHan instance = new EHan();

	private EHan(){}

	public static EHan getInstance(){
		return instance;
	}
}

3.双重校验锁(DCL)

赖汉模式在单线程下很够很好的保证只创建一个对象,但是在多线程高并发下却可能造成创建多个对象(非线程安全),至于为什么非线程安全百度一搜一大堆,我就不重复说了,现在主要是实现双重校验锁。

package com.market.design.single;

/**
 * @filename DoubleCheck
 * @description 双重校验锁(DCL)
 * @author 单例模式
 * @date 2020/12/23 17:16
 */
public class DoubleCheck {
	private static volatile DoubleCheck doubleCheck;

	private DoubleCheck(){}

	public static DoubleCheck getDoubleCheck(){
		if (doubleCheck == null){   //先判断对象是否为null
			synchronized (DoubleCheck.class){ //加锁
				if (doubleCheck == null){  // 加锁情况下再次判断对象是否被创建
					doubleCheck = new DoubleCheck(); //加锁情况下创建对象
				}
			}
		}
		return doubleCheck;
	}
}

补充:我在定义DoubleCheck 对象时加了volatile关键字,在多线程高并发的情况下这个关键字必须加上,因为它在这里起到的最大的作用就是防止指令重排序,至于原理,请大家去b站搜一下马士兵老师视频,关键字volatile,讲的很透彻,大概两个小时左右。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值