Java单例模式双检锁原理
一、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单例模式双检锁原理相关推荐
- Java的懒汉式双检锁单例模式
Java的懒汉式双检锁单例模式 文章目录 Java的懒汉式双检锁单例模式 一. 实现一个双检锁 二. 为什么线程不安全 三. 关于指令重排序 四. 关于原子操作 五. 实现线程安全的双检锁 首先回忆一 ...
- 单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...
- 单例模式(懒汉模式-双检锁、饿汉模式、静态内部类模式)-详细
文章目录 前言 单例模式(懒汉模式-双检锁.饿汉模式.静态内部类模式)-详细 01 单例模式是什么? 02 单例模式的好处? 03 单例模式的三种模式 03::01 懒汉模式 03::01::01 问 ...
- sentinel里的双检锁
单例模式有很多种,饿汉式,懒汉式,双检锁,公司里大部分都是选择了双检锁,其中sentinel的ContextUtil源码里就有相关的实现: protected static Context trueE ...
- Java单例模式双重检查锁定中volatile关键字的作用
首先要说的是,个人推荐使用饿汉模式和静态内部类方式实现单例模式.其实,静态内部类里也是一个饿汉模式. 懒汉模式中,双重检查锁定代码如下: public class Singleton{ // 静态属性 ...
- 并发编程笔记——第六章 Java并发包中锁原理剖析
一.LockSupport工具类 JDK中的rt.jar包里的LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础.LockSupport类与每个使用它的 ...
- 设计模式之:深入浅出 java 单例模式(Singleton)
2019独角兽企业重金招聘Python工程师标准>>> 1.背景 在Java帝国,有一个隐蔽的村庄叫IO村,村里每个人都身怀绝技.其中,SocketIO.HttpIO.FileIO更 ...
- 看到“java单例模式”脑壳疼,学会这几招分分钟搞定
单例模式 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系 ...
- Java 单例模式常见五种实现方式
定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...
- java双链表基本方法_Java数据结构之双端链表原理与实现方法
本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...
最新文章
- 服务器搬迁方案_数据中心机房改造搬迁IDC机房工程建设
- mysql的limit优化_mysql数据库limit优化例子(百万级数据)
- signature=ec663bb1ca3cfa2e278da44aa044d1c6,Fair Exchange of Signatures with Multiple Signers
- 20145213《信息安全系统设计基础》第二周学习总结
- _IO, _IOR, _IOW, _IOWR 宏的用法与解析
- OpenCV下载驿站(解决github下载问题,解决OpenCV官网下载较慢)
- 计算机win764位相机驱动,Win7万能驱动64位
- 笔记本如何解除锁定计算机,笔记本键盘锁定解锁方法教程
- 使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
- java解压obb_obb文件怎么解压 打开obb文件的注意事项 - 驱动管家
- 模式源于生活:代理模式---中介租房
- Vue3 项目遇到的问题
- 编写电话号码查询系统
- elementui实现上传视频功能+预览
- python系列——多进程之进程池(pool)
- tomcat服务器报503
- fabric.js学习
- linux检测内存条损坏,在Linux中检查可用内存的5种方法
- QT命令行编译时出现'mingw32-make'不是内部或外部命令,也不是可运行的程序或批处理文件
- 同指数幂相减公式_同底指数加减运算法则