双重加锁单例模式剖析

2023-05-16

话不多说,首先上代码!!!

public class Singleton{
	//将实例化对象设置为一个属性,并用static修饰
	private volatile static Singleton singleton;
	//无参构造器
	private Singleton(){};
	//获取对象实例的方法
	public static Singleton getInstance(){
		//进行第一次if判断 
		if(singleton == null){
			//进入同步代码块
			synchronized(Singleton.class){
				//进行第二次if判断
				if(singleton == null){
				//获取实例对象
				 singleton = new Singleton();
				 }
			}
		}
		//返回获取方法的实例对象
		return singletion;
	}	
}

对于上面的代码,主要的疑问点可能集中于下面的几个,我将一一说明。
(1)为什么需要两次if判断?各自起的作用是什么?
(2)为什么需要volatile修饰变量?
(3)synchronized关键字的使用方式?

1)两次if判断与校验
a.第一次if(singleton ==null)所起的作用主要是作为提高代码的执行效率,因为是单例模式,所以如果已经创建过对象了,所以在进入实例化方法getInstance()时就不需要进入到同步代码块中去了。
b.第二次if(singleton==null)所起的作用主要是为了避免在同步代码块内创建重复的多个对象。用人话说是啥意思呢?我说个例子,你就明白了。如果这个时候有两个线程T1与T2,两个线程几乎同时进入到getInstance()方法中,但是T1稍微快一丢丢,singleton还未被实例化还是为null,这个时候T1线程首先进入到了同步代码块中,但是还未实例化对象,此时singleton还是为空,这时,T2线程通过第一层判断,因为对象还未被实例化,所以T2等待T1处理(等待在同步代码块外),接着T1通过第二层if判断,完成实例化创建好对象,然后完成任务,这个时候资源回到T2线程,T2线程开始进入到同步代码块,如果没有第二个if判断,那么T2线程将再创建一个自己的实例对象,但是现实情况是T1已经在之前创建了实例对象,所以如果不加第二层判断,会导致多个线程产生多个实例化对象。

2)Volatile修饰
对于为社么需要给变量添加这个关键字,为什么是必不可少的呢?
volatile在这里主要的作用为两个方面。
a.防止JVM指令重排的发生;
分析:
对于singleton = new Singleton();这行代码可以分为三个步骤:
1.给singleton分配内存空间;
2.初始化singleton;
3.将singlton指向分配的内存空间;

但是在实际的运行中,由于JVM的指令重排,可能会导致实际的运行顺序由上面的123变为132。
指令重排在单线程下不会出现问题,但是在多线程下会导致一个线程获得一个未初始化的实例。例如:线程T1执行了1和3,此时T2调用 getInstance() 后发现 singleton 不为空,因此返回 singleton, 但是此时的 singleton 还没有被初始化。
使用 volatile 会禁止JVM指令重排,从而保证在多线程下也能正常执行。

b.保证变量再多线程运行时的可见性。
指令重排在单线程下不会出现问题,但是在多线程下会导致一个线程获得一个未初始化的实例。例如:线程T1执行了1和3,此时T2调用 getInstance() 后发现 singleton 不为空,因此返回 singleton, 但是此时的 singleton 还没有被初始化。
使用 volatile 会禁止JVM指令重排,从而保证在多线程下也能正常执行。

3)synchronized 关键字的使用方法
1.修饰实例方法,相当于给当前对象实例加锁,进入同步代码块之前要获得当前对象实例的锁。
2.修饰静态方法,相当于给当前类对象加锁,进入同步代码块之前需要获取当前类对象的锁。
3.修饰同步代码块,指定对象,给指定对象加锁。在进入同步代码块之前要先获取给定对象的锁。
和 synchronized 方
法一样, synchronized(this) 代码块也是锁定当前对象的。 synchronized 关键字加到 static 静态方法和
synchronized(class) 代码块上都是是给 Class 类上锁。这里再提一下: synchronized 关键字加到非 static 静态方法上是给对象实例上锁。

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

双重加锁单例模式剖析 的相关文章

  • touchgfx 浮点数显示

    最近在研究touchgfx xff0c 太懵了 xff0c 也就好久没有更新博文了 xff0c 很坑的一点 xff0c 我就想在屏幕上显示一个小数 xff0c 翻看了N多的博文 xff0c 没一个管用的 xff0c 这里分享一下我的方案 选
  • 浅谈专线(SD-WAN)

    存在就一定有存在的道理 xff0c 今天要说的网络知识点是专线 我们一步步来 xff0c 先说专线是什么 xff0c 然后说专线的特性 xff0c 最后说专线的未来 一 什么是专线 专线就是专门分的线路 xff0c 是运营商为企业客户分配的
  • Ubuntu18系统设置自定义分辨率1920*1080

    一般安装完unbuntu后会发现系统分辨率没有19201080 xff0c 需要手动自定义添加19201080分辨率 打开终端 xff0c 输入命令 xff1a xrandr xff0c 可以查看系统所有分辨率 输入命令生成显示 xff1a
  • 基于饿了么骨架屏方案,使用Chrome扩展程序生成网页骨架屏

    前言 之前写移动端项目的时候 xff0c 使用骨架屏来解决首屏渲染时出现短暂空白现象 xff0c 采用了就是饿了么page skeleton webpack plugin方法 但是page skeleton webpack plugin需要
  • 别瞎删package-lock.json了

    作者 xff1a wuwhs 原文 xff1a https segmentfault com a 1190000039684460 0 前言 看完本文 xff0c 你将从整体了解依赖版本锁定原理 xff0c package lock jso
  • Naive-UI,尤大推荐的Vue组件库

    前言 早上坐地铁上班的时候 xff0c 刷到推特推送了naive组件库有关的信息 点进去看了介绍 xff0c 觉得不错 xff0c 就来分享一下 组件库文档地址 xff1a www naiveui com 值得注意的是 xff0c vue作
  • 2021下半年最新前端求职面试指导(完整版)

    两周前 xff0c 学弟通过了阿里六轮面试 xff0c 顺利拿到了 Offer xff01 负责高德地图的前端部署 薪资待遇很不错 xff0c 30K 15薪 在此之前 xff0c 他在国营公司干了3 年 xff0c 这次回到大厂 xff0
  • 一文讲懂npm link

    前言 在本地开发npm模块的时候 xff0c 我们可以使用npm link命令 xff0c 将npm 模块链接到对应的运行项目中去 xff0c 方便地对模块进行调试和测试 用法 包链接是一个两步过程 xff1a 1 为依赖项创建全局软链np
  • Typescript中的extends关键字

    前言 extends关键字在TS编程中出现的频率挺高的 xff0c 而且不同场景下代表的含义不一样 xff0c 特此总结一下 xff1a 表示继承 拓展的含义表示约束的含义表示分配的含义 基本使用 extends是 ts 里一个很常见的关键
  • 记一次 React 开源甘特图组件的性能优化,已合入 PR!

    背景 公司项目最近用到甘特图功能 xff0c 于是集成了一款开源的甘特图插件 甘特图的主要作用是项目管理 xff0c 可以用图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间 xff0c 如下图 image png
  • 【干货】Chrome插件(扩展)开发全攻略

    作者 xff1a 小茗同学 https www cnblogs com liuxianan p chrome plugin develop html comments 一 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 xff0c
  • 很多人上来就删除的package-lock.json,还有这么多你不知道的(深度内容)

    作者 xff1a wuwhs 原文 xff1a https segmentfault com a 1190000039684460 0 前言 看完本文 xff0c 你将从整体了解依赖版本锁定原理 xff0c package lock jso
  • Svelte 原理浅析与评测

    简介 Svelte 是一个构建 web 应用程序的工具 xff0c 与 React 和 Vue 等 JavaScript 框架类似 xff0c 都怀揣着一颗让构建交互式用户界面变得更容易的心 但是有一个关键的区别 xff1a Svelte
  • CKS32F103C8T6最小系统板调试记录——SWD下载

    cks32f103是国产芯片 xff0c 由中科芯研发 xff0c 比起ST公司F103多了一个刹车功能 它有keil的器件安装包 xff0c 支持keil的开发 器件安装包链接 xff1a 链接 百度网盘链接 提取码 xff1a 0xyu
  • React useEvent:砖家说的没问题

    之前写了一篇文章 React Hooks 使用误区 xff0c 驳官方文档 1 xff0c 文中抛出了两个观点 xff1a 不是所有的依赖都必须放到依赖数组中deps 参数不能缓解闭包问题 这两个观点引起了剧烈的讨论 xff0c 当然大多数
  • Disabled PicPipeline: ImagesPipeline requires installing Pillow 4.0.0 or later

    目录 一 scrapy是什么 二 问题以及原因 三 解决办法 1 确保系统已经安装了 Pillow 库 2 安装 Pillow 库 3 在项目根目录中添加 Pillow 的 pth 文件 一 scrapy是什么 Scrapy是一个用于从网站
  • ERROR 1129 (HY000): Host ‘192.168.0.1‘ is blocked because of many connection errors; unblock with ‘m

    MySql远程链接报错 问题 xff1a mysql u root h 192 168 0 1 p Enter password ERROR 1129 HY000 Host 39 192 168 0 1 39 is blocked beca
  • JVM虚拟机详解

    一 JVM简介 JVM是Java Virtual Machine Java虚拟机 的缩写 简单来说JVM是用来解析和运行Java程序的 虚拟机是一种抽象化的计算机 通过在实际的计算机上仿真模拟各种计算机功能来实现的 Java虚拟机有自己完善
  • 云计算OpenStack详解

    一 OpenStack简介 1 OpenStack发展历程 2002年 美国著名的电商公司亚马逊 Amazon 干了一件 不务正业 的事 他们向客户推出了一项全新的业务 包括存储空间 计算能力等资源服务的Web nbsp Service 这
  • Linux虚拟化网络之vlan配置

    问题描述 Linux主机划分两个vlan 服务器server1的物理网卡的IP地址为1 1 1 1 24 服务器server2的物理网卡的IP地址为1 1 1 2 24 物理网卡下要虚拟化出来两个Vlan子接口 vlan10中主机的IP地址

随机推荐

  • 部署SDN控制器对接OVS网元实现转控分离实战 附ODL控制器

    1 云计算对网络的需求 1 多租户网络隔离 云中包含多个租户 不同租户可以自己设计自己的内部网络 172 16 0 0 10 0 0 192 168 0 存在安全隐患 要让不同租户网络要分隔开 nbsp 不同租户的网络需要互相二层隔离 三层
  • Python 数据采集、清洗、整理、分析以及可视化实战

    一 数据分析思路 大概可以分为下面这几个步骤 数据采集 原始数据完整性检查 数据清洗 整理 从不同角度对数据进行分析 数据可视化 总结 主要使用 Python 来进行分析 数据采集 主要涉及的 python 库包括 requests Bea
  • ERROR: torch-1.6.0+cu101-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.

    目的 xff1a 使用混合精度训练模型 方法 xff1a 最新版pytorch1 6已封装进混合量化的模块 xff0c 只需几句代码就可以提高batch size 速度会有非常大的提升 安装pytorch xff1a pip install
  • Clash开启系统代理System proxy后无效,无流量

    在注册表目录 xff1a HKEY LOCAL MACHINE SOFTWARE Policies Microsoft Windows CurrentVersion Internet Settings 设置ProxySettingsPerU
  • Proximal Policy Optimization(PPO)算法原理及实现!

    Proximal Policy Optimization PPO 算法原理及实现 xff01 这两天看了一下李宏毅老师的强化学习课程的前两讲 xff0c 主要介绍了Policy Gradient算法和Proximal Policy Opti
  • 树莓派4b ubuntu 20 设置阿里源

    前言 设置国内源其实很简单 xff0c 但是由于我是下载的 64位 操作系统 xff0c 并且树莓派是arm架构 xff0c 所以有一点不同 执行 lsb release a 查看发行版本 ubuntu 64 ubuntu etc netp
  • CAS登录流程

    访问 http localhost analysis 请求会被ngixn如下配置拦截 location analysis root D work dist index index html index htm try files uri u
  • 解决centos7 sshd端口修改后,重启服务器sshd无法连接的问题

    针对centos7的变化 xff0c 修改sshd端口需要修改 etc ssh sshd config selinux 防火墙 1 修改 etc ssh sshd config 执行命令 xff1a vi etc ssh sshd conf
  • osmWebWizard.py: error: typemap file “E:\SUMO\tools\data\typemap\osmPolyconvert.typ.xml“ not found

    在使用sumo的时候 xff0c 根据官方文档 xff08 OSMWebWizard SUMO Documentation dlr de xff09 显示 xff0c 在tools目录下使用python osmWebWizard py 来生
  • 内核与驱动_08_键盘驱动原理及代码

    文章目录 技术原理Windows中从击键到内核流程 键盘硬件原理键盘过滤的框架搭建应用设备扩展键盘过滤模块的动态卸载键盘过滤的请求处理通常的处理 PNP的处理读的处理读完成的处理从请求中打印出按键信息从缓冲区中获得KEYBOARD INPU
  • LCD 12864B V2.0的使用

    内置ST7920控制器和中文字库的LCD12864的使用 前言 大家好 xff0c 我是小灬贱 今天我给大家带来LCD12864的使用方法以及我的一些经验 文章里面如有不妥之处或者表达不清晰的地方还请各位多多指教 可以在文下评论或者私信我
  • Unity:内存管理、GC优化

    目录 一 GC简介 1 堆内存分配和回收机制 2 垃圾回收时的操作 3 何时会触发垃圾回收 xff1f 4 GC操作带来的问题 二 GC优化 1 降低GC影响的方法 2 减少内存垃圾的数量 3 造成不必要的堆内存分配的因素 1 字符串 2
  • C# 常用的文件IO操作

    目录 一 IO流 1 文件夹操作 Directory类 2 文件操作 File类 3 路径操作 Path类 4 读取文件 StreamReader类 5 写入文件 StreamWriter类 二 动态链接库kernel32 1 写入文件 2
  • OutLine源码解析 -- 为什么要尽量避免使用OutLine

    相信很多人在刚入职Unity的时候都被告诫过尽量避免使用OutLine xff0c 只知道它很费性能 xff0c 但是很多人并不知道它为什么很费性能 今天通过源码来探索一下 首先看一下OutLine cs里的源码 public overri
  • Lua高级应用

    一 lua数据结构及内存占用分析 1 基础数据结构 lua的基本数据表示是type 43 union 的方式 xff0c 根据不同类型映射到union的不同结构上面 xff0c 统一的表示结构lua TValue xff1a typedef
  • VirtualBox虚拟机安装CentOS7.6后无法ssh远程连接虚拟机

    问题如题所述 安装完 xff0c 一般都是使用ip addr查看虚拟机IP后通过远程工具来尝试连接 虚拟机IP 然后会发现通过此IP无法连接 解决办法 xff1a 修改VirtualBox的网络配置 1 查看VirtualBox对应网卡的I
  • UGUI实现text渐变色(通过自定义富文本标记实现)

    之前分享过一个通过添加组件实现渐变色的文章 xff0c 但是通过组件实现有一个弊端 xff0c 他只能设置整个文本渐变 xff0c 不能只设置一段文字渐变 今天分享一个通过正则匹配自定义的富文本标记来实现渐变色的方法 xff0c 这样的好处
  • 如何实现自定义绘制Winform的TreeView并且实现多选

    自定义绘制背景 xff0c 节点字体 xff0c 树节点后面加按钮 xff0c 自定义展开节点样式 效果如下 xff1a 同时选中节点5和节点6下的Tree 先设置TreeView的DrawMode 61 System Windows Fo
  • RSTP协议原理与配置整——STP的不足

    STP协议虽然能够解决环路问题 xff0c 但是由于网络拓扑收敛较慢 xff0c 影响了用户通信质量 xff0c 而且如果网络中的拓扑结构频繁变化 xff0c 网络也会随之频繁失去连通性 xff0c 从而导致用户通信频繁中断 xff0c 这
  • 双重加锁单例模式剖析

    话不多说 xff0c 首先上代码 xff01 xff01 xff01 span class token keyword public span span class token keyword class span span class t