Java单例模式双检锁原理

2023-05-16

一、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就直接返回了,从而导致错误。
二、第一个非空判断是为了效率,如果判断是非空,那么直接返回就行了,没必要再进入同步代码块
三、第二个非空判断放在了同步代码块里面,是因为要避免多个线程同时创建对象的情况发生

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java单例模式双检锁原理 的相关文章

  • select、poll、epoll简介

    select poll epoll都是IO多路复用机制 xff0c 都可实现同时监听多个I O事件的状态 xff0c 多路复用就是通过一种机制监视多个描述符 xff0c 一旦某个描述符读或者写就绪就能通知代码进行读写操作 本质他们都是同步I
  • 【无标题】

    pro git学习笔记 持续更新ing 感觉一直对git的了解不够深入 xff0c 每次都是用到什么功能现去找 xff0c 但这样每次查询都耗费时间并且可能出错 xff0c 索性将git系统性地学习一遍 xff0c 下面是记录的学习笔记 一
  • C++中的std::string_view和std::span

    string view是C 43 43 17标准引入 xff0c std span是C 43 43 20引入 xff0c 两个特性都比较类似 1 std string view string view是字符串的视图 xff0c 由于传统的s
  • 《Word中同一标点符号在不同位置空白间距不一致应怎样调》

    在写文档时出现类似于下图这种情况 xff0c 段落格式设置一模一样 xff0c 同样是中文标点符号 xff0c 没有空格 xff0c 都是半角 xff0c 但就是标点的空白间距不同 设置方法 xff1a 段落 中文版式 选项 版式 字符间距
  • 【技巧】十大深度学习技巧和经验总结

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • VS中报错IntelliSense: argument of type "void *" is incompatible with parameter of type "const char *"

    在用VS编写C 43 43 程序的时候 xff0c 遇到这样的问题IntelliSense argument of type void is incompatible with parameter of type const char xf
  • VS控制台程序被暂停,回车继续运行

    最近用vs调试程序时 用控制台定时1s打印一次信息 xff0c 调试过程发现偶尔出现控制台停止打印 不管是否开启多线程 xff0c 都会出现该问题 xff0c 而且也怀疑可能是sleep xff08 xff09 延时阻塞导致的问题 后来多次
  • VS如何设置显示代码行数

    设置VS显示代码行数 可以方便调试代码 xff0c 工具 选项 文本编辑器 C C 43 常规 行号勾选上 参考了https jingyan baidu com album af9f5a2d2e193543140a4533 html pic
  • 程序员自我介绍

    转自https www cnblogs com univeryinli p 5838781 html 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1
  • win10磁盘占用率过高解决办法

    最近总觉得系统用起来很卡 xff0c 一看任务管理器发现win10磁盘占用率接近100 xff0c 而且在任务管理器中也关不掉 xff0c 然后百度了一下 xff0c 发现可能是家庭组导致 xff0c 结果还真是 xff0c 下面给出解决方
  • 2020届华为C++软件开发实习面试经验

    前几天去华为实习面试 xff08 虽然笔试0AC xff0c 还是收到面试通知 xff09 xff0c 现在记录一下面试心得 xff0c 后面继续好好准备 实习面试分技术面和综合面 xff1a 1 感觉技术面试重视基础 xff0c 问c 4
  • 自己编写的字符串分割函数mysplit()

    利用strtok 函数封装成的字符串分割函数mysplit sourceStr为源字符串 splitSymbol为分隔符号 strArray为分割后的字符串 xff0c 以vector形式返回 include lt iostream gt
  • OVS Bond lacp源码分析

    近期项目中要使用Ovs bond接口 xff0c Ovs Bond 只有三种模式 xff1a balance tcp xff0c balance slb xff0c active backup 这三种模式的工作方式如下 xff1a 1 ac
  • VNC

    VNC Virtual Network Computing 是 虚拟网络 计算机的缩写 VNC 是一款优秀的 远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Linux 操作
  • ubuntu 安装图形界面 tasksel不成功

    1 执行tasksel相关的安装命令一直报错 xff0c 经过改源等操作都不行 sudo tasksel install ubuntu desktop 2 参考下面的博客Ubuntu安装图形界面 xff08 桌面 xff09 yangxin
  • 【ChatGPT】比尔·盖茨最新分享:ChatGPT的发展,不止于此

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • 51单片机(十).避障与循迹小车

    实验简介 使用STC89C53单片机作为主控制器芯片实现了带全向轮的两轮驱动避障以及循线小车 xff0c 感知模块为超声波和红外传感器 本实验分为3个独立的部分 xff1a 1 利用超声波实现小车的避障功能 xff1b 2 利用红外传感器实
  • 一点小小的感悟

    从2017年发表了第一篇CSDN文章 xff0c 到现在已经过去了快五年的时间 五年前的我是一名学生 xff0c 五年后的今天我依旧是一名学生 xff0c 区别是从一名大二学生成为了现在的研二学生 这一路走来 xff0c 经历了很多很多事情
  • Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计

    1 功能介绍 本项目所设计的机器人需要实现的功能为 xff1a 操作员在操作终端 xff08 手机或PC端 xff09 通过Wi Fi连接到小车上Wi Fi模块所在的网络中 xff0c 向其发出相关操作指令 xff0c 在Wi Fi模块接收
  • STM32单片机(二).STM32系列单片机的介绍

    STM32系列芯片是为要求高性能 低成本 低功耗的嵌入式应用设计的ARM Cortex M0 M0 43 M3 M4和M7内核 xff0c 按照内核架构分成不同的产品 其主流的产品有STM32F0 STM32F1和STM32F3 xff1b

随机推荐

  • STM32单片机(六). 传感器的使用

    传感器是单片机外围电路中最常见的模块 xff0c 在搭配了各种形式的传感器电路后 xff0c 就可以采集到的更多的环境信息 在本章节中 xff0c 主要介绍呼吸灯 温度传感器 RTC实时时钟以及红外遥控模块的控制使用 1 PWM实现呼吸灯的
  • STM32单片机(七). USART串口、IIC和CAN通信

    在简单的学习过了STM32中的简单外设以及中断系统后 xff0c 在本章节中开始介绍STM32芯片中各个通信接口的配置 在计算机中 xff0c 按数据传输方式可分为串行通信以及并行通信 xff1b 按数据同步方式可分为异步通信和同步通信 x
  • STM32单片机(八). ADC、DAC和DMA数据传输

    对于STM32的ADC模数转换器的介绍以及配置在文章 STM32单片机 xff08 六 xff09 传感器的使用 中已经详细介绍 xff0c 在本章节中主要介绍DAC数模转换器以及DMA的使用 1 DAC转换 1 1 数模转换器的介绍 DA
  • 虚拟机中安装Ubuntu 20.04,Liunx系统的常用命令以及工具安装

    因工作学习 需求 xff0c 在虚拟机软件VirtualBox安装了Ubuntu 20 04系统 xff0c 本章节中主要介绍一些环境的安装以及Liunx中常用的一些命令 1 软件和系统的安装 1 1 VirtualBox VirtualB
  • 51单片机(二).STC89C52单片机的引脚功能

    1 主电源引脚VCC和VSS 电源VCC接 43 5V xff0c VSS接地端 xff0c 即公共参考地 2 时钟电路引脚XTAL1和XTAL2 STC89C52芯片内部设置了一个反相放大器 xff0c XTAL1为放大器输入端 xff1
  • 51单片机(四).C51编程语言

    一 xff0e 常量与变量 1 常量 又称为标量 xff0c 在程序执行过程中不能改变 xff0c 常量数据类型有整形 xff08 int xff09 浮点型 xff08 float xff09 字符型和字符串型 应用中一般使用 defin
  • 【动态绘图】python可视化--丝滑版

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • TI DSP TMS320C66x学习笔记之DSP优化经验(八-1)

    此文是在http blog csdn net guanchanghui article details 1181851基础上 xff0c 通过自己的学习理解修改而来 暂且算作是自己的原创吧 如有侵权 xff0c 联系 xff0c 立刻改转载
  • Qt connect信号连接的几种写法

    概述 Qt 中的信号和槽应该是最熟悉不过的了 xff0c 连接信号和槽的关键字 connect有五种连接类型 xff0c 今天不是介绍这五种连接类型 xff0c 而是简单的总结一下 connect 的几种新旧写法 xff0c 其实在新版本中
  • ubuntu20.04系统的英文语言换成中文语言

    1 ubuntu20 04下载安装成功后 xff0c 默认系统语言为英文 英文界面切换到中文界面 xff0c 点击设置 2 选择对应的区域和语言 3 点击 Manage Installed Languages 上面那个 43 xff0c 然
  • he packaging for this project did not assign a file to the build artifact

    一 maven 工具中 xff0c 项目目录下 xff0c 点击运行Plugins install install install 抛出出错误 xff1a The packaging for this project did not ass
  • USB的枚举过程

    所谓USB设备与主机是通过检测Vcc上拉电阻的变化来确定是否有设备连接的 在D12内部集成了1 5k 的上拉电阻 xff0c 默认状态下不与Vcc相连 xff0c 程序运行时可以向D12发送连接命令使1 5k 电阻连接到Vcc xff0c
  • VNC远程登录树莓派的图形界面

    使用树莓派的一种经典方式 xff0c 是远程登陆进行操作 常用的方法有两种 xff0c 一种是通过SSH协议 xff0c 一种是使用VNC工具 这两种方法在Raspbian xff08 至迟2017年3月版 xff09 上都是集成的 xff
  • STM32 TIM PWM中阶操作:互补PWM输出

    STM32 TIM PWM中阶操作详解 xff1a 互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用 xff0c 功能包括单线 非互补PWM输出 xff0c 双线 互补PWM输出 xff0c 以及死区时间和刹车控制等
  • 关于“对抗样本攻击”的思考

    什么是 对抗样本攻击 笔者给 对抗样本攻击 下的定义是 xff1a 通过精心的构造原始数据 xff0c 使得机器学习模型以较大概率返回和事实相反的结果 最经典的例子就是对于图像 人脸识别系统的攻击样本了 比如 加入一些噪点 xff0c 让G
  • yum nping已加载插件:fastestmirror, langpacks没有该命令:nping。解决办法:第一步:测试网络是否连接

    版本 xff1a centos7 问题 xff1a 找不到nping命令 xff0c 试过重装也没用 xff0c 每次重装都失败 xff0c 或者出现yum nping 已加载插件 xff1a fastestmirror langpacks
  • 自己动手写操作系统——(1)将引导写入U盘

    为什么写博客呢 xff0c 想了一下 xff0c 首先是为了给自己留着复习用 xff0c 因为时间一长 xff0c 肯定有好多东西会忘记的 xff0c 在这里留个记录 xff0c 以后再整理起来就不会太麻烦了 xff1b 再者是为了分享一下
  • errno_t open_s()打开文件出现的错误分析

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 编译环境 xff1a VS2015 61 61 61 61 61 61 61 61 61
  • 解决redis启动时的三个警告The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxcon

    第一个警告 xff1a The TCP backlog setting of 511 cannot be enforced because proc sys net core somaxconn is set to the lower va
  • Java单例模式双检锁原理

    一 Java中什么是双检锁模式 xff1f 双检锁又名双重检查锁 xff0c 可以保证我们使用单例模式的时候避免多个线程竞争 xff0c 导致同一个对象被实例化多次 二 单例模式中除了双检锁还有什么模式 xff1f 还有比如饿汉式 xff0