JUC:double-checked locking(DCL) 懒汉单例模式

文章目录

  • double-checked locking(DCL) 问题
    • 解决方法
  • volatile作用

double-checked locking(DCL) 问题

  • 第一个if用于后续进入的线程,不用再获取锁来判断是否已经创建了对象。
  • 第二个if,为的是第一个进入的线程创建对象,以及防止卡在第一个if之后,获锁之前的线程在第一个线程已经创建对象的情况下,在获取锁后,判断不用创建对象,防止多次创建。

单例模式:

public final class Singleton {private Singleton() { }private static Singleton INSTANCE = null;public static Singleton getInstance() { if(INSTANCE == null) { // 首次访问同步,而之后的使用就不用 synchronized,所以在此行前加了判断  synchronized(Singleton.class) {if (INSTANCE == null) { INSTANCE = new Singleton(); } }}return INSTANCE;}
}

特点:

  • 懒汉式实例化
  • 首次使用加锁,之后不用加锁

但是,看似完美的代码,其实并不对,因为第一个if判断并不在synchronized中,所以可能会发生指令重排问题。

synchronized可以保证原子、有序、可见性,但是有序性需要变量完全synchronized被保护,这里第一个if并不在sync中,所以是可能发生下述情况的。

也就是说synchronized只能保证临界区内的指令不和临界区外的指令发生重排序。

比如先给INSTANCE赋值了,但是还没有调用构造方法,这时线程切换,他以为你创建好了对象,然后返回对象直接开始使用,是不是就出现问题了,因为我们对象还没构造呢。

在这里插入图片描述

解决方法

给Singleton加volatile。

public final class Singleton {private Singleton() { }private static volatile Singleton INSTANCE = null;public static Singleton getInstance() { if(INSTANCE == null) { // 首次访问同步,而之后的使用就不用 synchronized,所以在此行前加了判断  synchronized(Singleton.class) {if (INSTANCE == null) { INSTANCE = new Singleton(); } }}return INSTANCE;}
}

这样就是一个正确的代码了。

volatile作用

volatile作用:
可见性:

  • 写屏障(sfence)保证在该屏障之前对共享变量的改动,都同步到主存当中
  • 读屏障(lfence)保证在该屏障之后对共享变量的读取,加载的是主存中最新数据

有序性:

  • 写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后
  • 读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前

只能保证读数据正确,不能保证原子性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE:获取不同地表类型的Landsat地表温度(Land Surface Temperature,LST)时间序列

作者:CSDN _养乐多_ 本文将分享论文《Google Earth Engine Open-Source Code for Land Surface Temperature Estimation from the Landsat Series》中的基于Landsat时间序列影像计算地表温度的API和获取指定点(Land Surface Temperature,LS…

ZCMU操作系统课程实验 - 实验1-Linux的使用

登录 1. 打开这个东西 2. 在 文件 - > 打开 中打卡机房里VMOS文件里的这个东东 3. 然后依次操作下去好了,有红色的选项,我都是选的"Do nothing"。完成后就会出现这样一个黑框框。 4. 让你登录。输入:root。密码&…

Google Hacking从0到1

文章目录 前言1、什么是google搜索1.1基础查询1.2高级搜索1.3使用布尔运算符 2、高级运算符2.1运算符语法2.2常用运算符 3、Google Hacking 基础3.1目录列出3.1.1 查找特定目录3.1.2 查找特定文件3.1.3 服务器版本 3.2目录遍历/目录穿越 4、10个简单的安全搜索5、总结参考 前言…

【C语言】InfiniBand内核驱动_mlx4_ib_post_send

一、注释 以下是_mlx4_ib_post_send函数的注释,该函数用于处理InfiniBand工作请求(WRs)的发送过程: static int _mlx4_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr, bool …

PS从入门到精通视频各类教程整理全集,包含素材、作业等(5)

PS从入门到精通视频各类教程整理全集,包含素材、作业等 最新PS以及插件合集,可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 初寒调色案例及练习图 等文件 https://www.alipan.…

记一次使用spring事件机制失效排查修复

前言 在日常业务开发中过程,我们有时候为了业务解耦,会利用spring的机制,就是利用spring提供的ApplicationListener、ApplicationEventMulticaster等核心API来实现。(注: 我这边列的是核心底层API接口,正常…

电脑常见故障检测方法与对应问题分析说明

电脑常见故障检测方法与对应问题分析说明 前言说明1、机器无法开机故障2、屏幕无法显示3、无法联网4、能开机但是无法进入系统,提示not boot5、USB接口无法识别U盘 前言说明 本文为小白向,许多内容属于经验学而非科学,还望大佬们轻喷。 如上…

Word中使用Zotero插入文献

1. word 里面有插件 2. 插入文献 2.1 点击【Add/Edit Citation】 2.2 在方条中输入文献,回车 3. 显示Reference 在文档中选好reference的位置, 点击【Add/Edit Bibliograph

pygwalker+streamlit python看板库使用体验

算作前言 在 B 站看到 pygwalker 的介绍,很感兴趣。 是一个类似于简化版的 tableau 工具。 原版 docs PyGWalker 文档 – Kanaries 搭建看板 直接结合 streamlit 使用,streamlit 真的神器。 import pygwalker as pyg import pandas as pd import str…

分布式全闪占比剧增 152%,2023 年企业存储市场报告发布

近日,IDC 发布了 2023 年度的中国存储市场报告。根据该报告,在 2023 年软件定义存储的市场占比进一步扩大,分布式全闪的增长尤其亮眼,其市场份额从 2022 年的 7% 剧增到 2023 年的 17.7%,增长了 152%。 01 中国企业存…

递归遍历目录结构和树状展现

在D盘下创建文件夹“电影”,在文件夹“电影”下创建“华语”、“好莱坞”,在文件夹“华语”下创建文件“人民的名义.mp4”、“天安门传奇.mp4”、“程序员统治世界.mp4”,在文件夹“好莱坞”下创建文件“国王的演讲.mp4”、“速度与激情8.mp4…

Java接口与继承实践:Ether通信系统的构建(day16)

创建一个接口Icontroller, 再创建一个接口IReceiver, 创建一个子类实现IReceiver, 创建一个子类实现IContrller, 创建一个类Ether 创建一个Signal类 创建一个类Radiosignal继承Signal 创建一个用户User 最后创建一个Main类 今日总结&#xff1a…

梵宁教育课程介绍:设计之路,从这里开始

梵宁教育作为一家靠谱且正规的线上教育机构,在师资力量、教学内容、教学方式、服务保障以及社会责任等方面都表现出色。他们致力于为广大学员提供高质量的学习设计教育服务,帮助他们掌握核心知识和技能,实现个人价值和职业梦想。 梵宁教育的课…

【Android Studio3.5.2安装以及错误错误解决】

前言 下面是博主在安装Android studio时遇到的一些问题,并且花费很长时间寻找解决方法,经过了血和泪的教训下面将自己在安装过程中遇到的查看的资料贴出来(感谢各位大佬的文章帮助本闲狗解答疑惑,此处贴出原文链接,如…

【WEEK5】 【DAY5】DML语言【中文版】

2024.3.29 Friday 目录 3.DML语言3.1.外键(了解)3.1.1.概念3.1.2.作用3.1.3.添加(书写)外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写(被引用的表的被引用的部分)3.1.3.2.先创建表后修改表以添加…

《系统架构设计师教程(第2版)》第8章-系统质量属性与架构评估-02-系统架构评估

文章目录 1. 一些重要概念1.1 敏感点 (Sensitivity Point)1.2 权衡点 (Tradeoff Point)1.3 风险承担者 (Stakeholders)1.3.1 系统生产者1.3.2 系统消费者1.3.3 系统服务人员1.3.4 其它人员 1.4 场景 (scenarios) 2. 系统架构评估方法2.1 基于场景的架构分析方法(SAA…

漏洞-CORS跨域资源共享JSONP回调

CORS跨域资源共享 Cors漏洞详解 - FreeBuf网络安全行业门户 响应标头中 当Access-Control-Allow-Origin字段为*时&#xff0c;就代表任意域都可以访问&#xff0c;就导致了Cors漏洞的产生 构造poc <!DOCTYPE> <html> <script type"text/javascript&quo…

什么是智慧公厕?智慧城市下的智慧公厕有什么功能和特点?

随着科技的不断进步和城市化的加快发展&#xff0c;智慧城市已经成为我们生活中的一部分。而在智慧城市的建设中&#xff0c;智慧公厕作为城市基础设施的重要组成部分发挥着重要的作用。那么什么是智慧公厕&#xff1f;智慧公厕是针对公共厕所的日常使用、运行、管理、运营等过…

分析:两种不同的函数模板写法,其中一种为何不行

接上篇&#xff1a; 利用类型&#xff0c;做函数模板的“重载”-CSDN博客 比较两种模板的写法 为什么左边不可行&#xff1a; 注意&#xff0c;左边的写法的第二个模板参数&#xff0c;是默认参数的形式。为何这里采取了默认参数的形式呢&#xff0c;本意是想让编译器来走sfi…

Java学习之类和对象、内存底层

目录 表格结构和类结构 表格的动作和类的方法 与面向过程的区别 具体实现 对象和类的详解 类的定义 属性&#xff08;field 成员变量&#xff09; 方法 示例--编写简单的学生类 简单内存分析(理解面向对象) 构造方法(构造器 constructor) 声明格式&#xff1a; 四…