单例模式双重校验锁_单例模式作用特点及常见的单例模式分析

单例模式:

  1. 即在整个生命周期中,对于该对象的生产始终都是一个,不曾变化。
  2. 保证了一个类仅有一个实例,并提供一个访问它的全局访问点。

作用:

  1. 在要求线程安全的情况下,保证了类实例的唯一性,线程安全。
  2. 在不需要多实例存在时,保证了类实例的单一性。不浪费内存。

特点:

  1. 公有的方法获取实例,
  2. 私有的构造方法,
  3. 私有的成员变量。

一,饿汉式* @Description 饿汉式单例* 饿汉式单例关键在于singleton作为类变量并且直接得到了初始化,即类中所有的变量都会被初始化* singleton作为类变量在初始化的过程中会被收集进<clinit>方法中,该方法能够百分之百的保证同步,* 但是因为不是懒加载,singleton被加载后可能很长一段时间不被使用,即实例所开辟的空间会存在很长时间* 虽然可以实现多线程的唯一实例,但无法进行懒加载;

440b8ee58a20d80212710e79254f050d.png

二,懒汉式

* @Description 懒汉式单例模式* 可以保证懒加载,但是线程不安全* 当有两个线程访问时,不能保证单例的唯一性

669669c7dc3f1d7a29e406a83a7354c0.png

三,懒汉式加同步方法* @Description 懒汉式+同步方法单例模式* 即能保证懒加载,又可以保证singleton实例的唯一性,但是synchronizeed关键字的排他性导致* getInstance0方法只能在同一时间被一个线程访问。性能低下。

699586023d0b37a7005109c848b79eac.png

四,双重效验锁单例* @Description 双重校验锁单例(Double-Check)+Volatile* 对懒汉-同步方法的改进,当有两个线程发现singleton为null时,只有一个线程可以进入到同步代码块里。* 即满足了懒加载,又保证了线程的唯一性* 不加volition的缺点,有时候可能会报NPE,(JVM运行指令重排序)* 有可能实例对象的变量未完成实例化其他线程去获取到singleton变量。* 未完成初始化的实例调用其方法会抛出空指针异常。

58edb751683905487324e595e7bd992b.png

五,静态内部类单例* @Description 静态内部类的单例模式* 在Singleton类初始化并不会创建Singleton实例,在静态内部类中定义了singleton实例。* 当给静态内部类被主动创建时则会创建Singleton静态变量,是最好的单例模式之一

af7efa3f63fb5e761c36446d6e96e3e1.png

六,枚举类单例

* @Description 基于枚举类线程安全* 枚举类型不允许被继承,同样线程安全的,且只能被实例化一次。

09e7d2d319d10ee726fb87fddd9bd74d.png

想了解更多Java知识,或遇到任何Java相关问题,那就关注我吧,有问题我会第一时间回复你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值