单例模式之饿汉、懒汉模式

目录

1.单例模式

1.1 饿汉模式

1.2 懒汉模式


1.单例模式

单例模式能保证类在程序中只存在唯一一份实例.这一点在很多场景中都需要,比如JDBC中的DataSource实例就只需要一个.

单例模式具体的是实现方法主要有两种:饿汉模式懒汉模式.

1.1 饿汉模式

饿汉摸模式是指,在类加载的同时,创建实例

这段代码我们很容易理解,在加载类的时候就会创建好实例,通过getInstance 这个静态方法可以获取到这个实例.而该类将其构造方法的属性设为私有,说明在外界不能求创建该实例,确保了该实例只有一份.

因为该线程只涉及到了读操作,所以线程是安全的.

1.2 懒汉模式

类加载的时候不创建实例,第一次使用的时候才创建实例.

懒汉模式单线程版

从以上代码中我们可以发现,只有当第一次调用getInstance()方法时才会创建该类的实例,且只能创建一个实例.

但是这段代码在多线程下,还是安全的吗?很显然,既存在读又存在写,是线程不安全的.但是仔细分析一下,如果实例创建好了,那这段代码在多线程下就是安全的了.

我们加上synchronized可以改善这里的线程安全问题.

理解代码中的双重if判定和volatile:

加锁/解锁是一件开销比较高的事,而该代码只有首次创建实例的时候会出现线程不安全,所以走后续使用的时候就不需要加锁了.故最外层的if就是判断当前实例是否创建好.

volatile就是保证线程安全的可见性.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦A梦的110

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值