一、Java中什么是双检锁模式?
双检锁又名双重检查锁,可以保证我们使用单例模式的时候避免多个线程竞争,导致同一个对象被实例化多次
二、单例模式中除了双检锁还有什么模式?
还有比如饿汉式(程序启动时就将对象实例化出来)、懒汉式(程序启动时不加载,等需要用到这个对象了再去实例化)
三、双检锁模式怎么实现?

//代码示例
public class SingleInstance {//必须有volatile修饰(防止指令重排序)private volatile static SingleInstance instance;//构造函数必须私有(防止外部通过构造方法创建对象)private SingleInstance() {}public static SingleInstance getInstance() {//第一个判空(如果是空,就不必再进入同步代码块了,提升效率)if (instance == null) {//这里加锁,是为了防止多线程的情况下出现实例化多个对象的情况synchronized (SingleInstance.class) {//第二个判空(如果是空,就实例化对象)if (instance == null) {//新建实例instance = new SingleInstance();}}}return instance;}
}

总结:
一.对象的引用必须用volatile修饰,目的是禁止指令重排,防止错误发生。
原因:它不是一个原子操作,这个简单的赋值可以分为3步:
1、给对象分配内存
2、调用对象的构造方法
3、把引用指向分配的内存空间
这是正常逻辑的3个步骤,也只有按1 2 3执行后,这个引用才不是null。
但是Java内存模型允许这个进行指令重排序,也就是这3步可能是123也可能是132,所以这里就有问题了。
假如线程A和线程B,线程A已经跑到分析3处的代码,这时这条指令执行是132,刚把步骤3执行完,这时线程B跑到了分析1处的代码,会发现引用不为null了,这时线程B就直接返回了,从而导致错误。
二、第一个非空判断是为了效率,如果判断是非空,那么直接返回就行了,没必要再进入同步代码块
三、第二个非空判断放在了同步代码块里面,是因为要避免多个线程同时创建对象的情况发生

Java单例模式双检锁原理相关推荐

  1. Java的懒汉式双检锁单例模式

    Java的懒汉式双检锁单例模式 文章目录 Java的懒汉式双检锁单例模式 一. 实现一个双检锁 二. 为什么线程不安全 三. 关于指令重排序 四. 关于原子操作 五. 实现线程安全的双检锁 首先回忆一 ...

  2. 单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  3. 单例模式(懒汉模式-双检锁、饿汉模式、静态内部类模式)-详细

    文章目录 前言 单例模式(懒汉模式-双检锁.饿汉模式.静态内部类模式)-详细 01 单例模式是什么? 02 单例模式的好处? 03 单例模式的三种模式 03::01 懒汉模式 03::01::01 问 ...

  4. sentinel里的双检锁

    单例模式有很多种,饿汉式,懒汉式,双检锁,公司里大部分都是选择了双检锁,其中sentinel的ContextUtil源码里就有相关的实现: protected static Context trueE ...

  5. Java单例模式双重检查锁定中volatile关键字的作用

    首先要说的是,个人推荐使用饿汉模式和静态内部类方式实现单例模式.其实,静态内部类里也是一个饿汉模式. 懒汉模式中,双重检查锁定代码如下: public class Singleton{ // 静态属性 ...

  6. 并发编程笔记——第六章 Java并发包中锁原理剖析

    一.LockSupport工具类 JDK中的rt.jar包里的LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础.LockSupport类与每个使用它的 ...

  7. 设计模式之:深入浅出 java 单例模式(Singleton)

    2019独角兽企业重金招聘Python工程师标准>>> 1.背景 在Java帝国,有一个隐蔽的村庄叫IO村,村里每个人都身怀绝技.其中,SocketIO.HttpIO.FileIO更 ...

  8. 看到“java单例模式”脑壳疼,学会这几招分分钟搞定

    单例模式 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系 ...

  9. Java 单例模式常见五种实现方式

    定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...

  10. java双链表基本方法_Java数据结构之双端链表原理与实现方法

    本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...

最新文章

  1. 服务器搬迁方案_数据中心机房改造搬迁IDC机房工程建设
  2. mysql的limit优化_mysql数据库limit优化例子(百万级数据)
  3. signature=ec663bb1ca3cfa2e278da44aa044d1c6,Fair Exchange of Signatures with Multiple Signers
  4. 20145213《信息安全系统设计基础》第二周学习总结
  5. _IO, _IOR, _IOW, _IOWR 宏的用法与解析
  6. OpenCV下载驿站(解决github下载问题,解决OpenCV官网下载较慢)
  7. 计算机win764位相机驱动,Win7万能驱动64位
  8. 笔记本如何解除锁定计算机,笔记本键盘锁定解锁方法教程
  9. 使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
  10. java解压obb_obb文件怎么解压 打开obb文件的注意事项 - 驱动管家
  11. 模式源于生活:代理模式---中介租房
  12. Vue3 项目遇到的问题
  13. 编写电话号码查询系统
  14. elementui实现上传视频功能+预览
  15. python系列——多进程之进程池(pool)
  16. tomcat服务器报503
  17. fabric.js学习
  18. linux检测内存条损坏,在Linux中检查可用内存的5种方法
  19. QT命令行编译时出现'mingw32-make'不是内部或外部命令,也不是可运行的程序或批处理文件
  20. 同指数幂相减公式_同底指数加减运算法则

热门文章

  1. Apple Pay发展与安全
  2. ELK 收集 Docker 日志
  3. shopex服务器信息,shopex_全手册.doc
  4. 怎么在html中加水印,如何在h5网页添加水印
  5. DOS批处理命令之for命令(批量安装APK)
  6. 怎么用wps抽签_怎么制作抽签,WPS表格怎么制作抽签程序表格
  7. java 字符串占位符动态替换值工具类
  8. 红队免杀培训第二章-使用系统调用http 协议下载恶意载荷
  9. oracle财务数据权限思考
  10. 解决方案:智慧工地智能巡检方案视频监控系统