单例模式----双重检查锁

双重检查锁

双重检查锁:
双检锁:单例模式中用volatile和synchronized来满足双重检查锁机制;
在实现单例模式的时候往往会忽略掉多线程的情况,就是写的代码在单线程的情况下是没问题的,但是一碰到多个线程的时候,由于代码没写好,就会引发很多问题,而且这些问题都是很隐蔽和很难排查的。而volatile(java5):可以保证多线程下的可见性;

二次判空原因

第一次判断是为了验证是否创建对象,判断为了避免不必要的同步
第二次判断是为了避免重复创建单例,因为可能会存在多个线程通过了第一次判断在等待锁,来创建新的实例对象。
判断是为了在null的情况下创建实例代码会检查两次单例类是否有已存在的实例,一次加锁一次不加锁,一次确保不会有多个实例被创建。单例模式中用volatile和synchronized来满足双重检查锁机制
public class SingletonMode {
/*
volatile关键字: 保持内存的可见性–所有线程都能获取的共享内存的最新状态
* 理解:
* 不用volatile的状态: 老板让多个人共同完成一件事(初始状态为进行中),假设
* 其中某一个人完成后,事件状态变成了已完成,但是 其他人不知道这件事已完成,认为该事件依然处于进行中
* 这就造成了事情的状态与真实状态不同步的现象。
* 使用volatile的状态:板让多个人共同完成一件事(初始状态为进行中),假设
* 其中某一个人完成后,事件状态变成了已完成;此时
* 其他人立刻从老板那接到了事情已完成的通知,于是都明确了
* 这件事已经完成了。
*
* volatile的作用:每次读取前必须先从主存刷新最新的值
* 每次写入后必须立即同步回主存当中
*/

private static volatile SingletonMode singletonMode;

//构造函数修饰为private防止在其他地方创建该实例
private SingletonMode() {
}

/**
 * 有的代码中会将同步锁synchronized写在方法中,例如:
 *    public static synchronized SingletonMode getInstance(){.....}
 * 造成的弊端就是:多线程每次在调用getInstance()时都会产生一个同步,造成损耗。
 * 相应的我们需要保持同步的代码块仅仅就是:
 * 
  • 16
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值