双重检验锁

双重检验锁:设计模式中的单例模式,细分为单例模式中的懒加载模式。

单例模式

单例模式:指的是一个类只有一个对象。最简单的实现方式是设一个枚举类,只有一个对象。缺点是当对象还没有被使用时,对象就已经创建存在了,对内存的消耗大。

懒汉式和饿汉式

懒汉式:是指使用时才产生对象。

饿汉式:不管用没用到,一开始就创建好对象。

双重检验锁的代码实现(来自菜鸟教程)

**代码解析**

1.构造方法设为private(私有的)目的是防止外部new对象。因为单例模式只能有一个对象。否则就不是单例模式了。

2.在类里创建一个private的对象,防止外部直接访问对象。

3.每个线程都是通过getSingleton()方法来获取对象,相当于一个访问器。它是静态的,因为非静态方法要通过对象来调用,而我们不允许外部创建对象。又因为这个方法是static的,所以上面创建的对象也要static的,因为静态的方法只能访问类里静态的对象。

4.两个if(singleton==null)的作用)假设有x个线程同时访问getSingleton()方法想要获取对象,其中有5个执行到了第一个if(singleton ==null){},开始竞争锁,第一个竞争成功的向下执行最后得到对象,第二个if(singleton ==null){}是拦截第一个线程外的其他4个线程,(因为第一个线程竞争成功后,singleton就不为null了,第一个if就穿透了,需要后面的第二个if来拦截)这四个线程进入阻塞队列。如果后面又来了几个线程访问getSingleton()方法,会直接被第一个if(singleton ==null){}拦截。

5.volatile的作用是在new完Sigleton()对象后,立即告诉其他线程singleton不为null了。防止已经通过第一个if判断的线程继续去竞争锁。

6.锁不能加在getSingleton()方法上,而是加在代码块上,因为会影响效率,很多线程想要调用该方法,让其在判断完if(singleton==null)后再加锁效率浪费的时间更少。

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

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

相关文章

Backend - 日志记录

目录 1. settings.py 文件设定 2. book_log.py 文件设定 3. view 视图文件调用 1. settings.py 文件设定 文件位置:BookProject 目录下 LOG_PATH os.path.join(os.getcwd(), logs) # 设定日志文件位置:项目名下的logs文件夹中 2. book_log.py 文…

C++ 创建并初始化对象

创建并初始化C对象 当我们创建一个C对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方&#…

【扩散模型】生成模型中的Residual Self-Attention UNet 以及 DDPM的pytorch代码

参考: [1] https://github.com/xiaohu2015/nngen/blob/main/models/diffusion_models/ddpm_cifar10.ipynb [2] https://www.bilibili.com/video/BV1we4y1H7gG/?spm_id_from333.337.search-card.all.click&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 TOC 1 UNe…

视黄酸诱导基因-1敲除诱导树突状细胞的不成熟特性并延长异体移植小鼠的存活时间研究【AbMole】

器官移植是一种用于替换因疾病、损伤或其他原因受损的人体器官的医疗程序。尽管器官移植可以挽救生命并显著提高生活质量,但存在供体器官短缺、排斥反应、器官功能障碍、感染和药物副作用等问题。为了提高移植成功率和受体健康,需要有效的免疫策略。树突…

如何使用支付宝沙箱环境本地配置模拟支付并实现公网远程访问【内网穿透】

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境…

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobFailMonitorHelper初始化 (5)

文章目录 前言一、JobFailMonitorHelper作用:二、JobFailMonitorHelper源码内容:2.1 start() 初始化2.1.1 任务失败重试:2.1.2 任务失败告警信息发送:2.1.2.1 JobAlarmer 告警类:2.1.2.2 alarm 告警信息发送: 2.2 toStop() 终止线…

数据可视化原理-腾讯-3D网格热力图

在做数据分析类的产品功能设计时,经常用到可视化方式,挖掘数据价值,表达数据的内在规律与特征展示给客户。 可是作为一个产品经理,(1)如果不能够掌握各类可视化图形的含义,就不知道哪类数据该用…

壁炉火焰温和而宁静,警惕火焰凶猛的潜在危害

在寒冷的冬夜,壁炉散发的温暖和闪烁的火焰成为家庭的心灵港湾。然而,我们在享受壁炉带来的温馨时,有时候也要关注火焰的凶猛度,因为它可能引发一系列潜在危害。 首先,壁炉的火焰过于凶猛可能导致空气质量下降。当火焰过…

从零开始手写RPC框架(4)

这一节主要讲述网络传输模块的代码,并且几乎每一行代码都加上了我个人理解的注释,同时也讲述了其中一些以前没见过的函数,和大致的底层运行逻辑。 目录 网络传输实体类网络传输实现基于Socket实现网络传输基于Netty实现网络传输客户端服务端 …

【JavaEE进阶】 Linux常用命令

文章目录 🍃前言🌴ls 与 pwd🚩ls🚩pwd 🎍cd🚩认识Linux目录结构 🍀touch与cat🚩touch🚩cat 🌲mkdir与rm🚩mkdir🚩rm 🎄cp与…

GD库没有安装FreeType 支持Call to undefined function App\Services\imagettfbbox()

GD库是一个功能强大的图像处理库,广泛用于生成和处理图像。然而,默认情况下,GD库不包含FreeType扩展,该扩展用于处理字体和文本。如果您需要在GD库中使用更多的字体和文本效果,您可以按照以下步骤安装和启用FreeType扩…

十五、单词造句

描述 GG Bond在和妹妹做一个游戏,GG Bond给定了妹妹一些单词字符串,他想让妹妹把这些单词拼接成以空格间隔开的句子,很可惜妹妹Python没有学好,你能使用join函数帮帮她吗? 输入描述: 多行输入多个字符串…

Java基础 - 7 - 常用API(二)

API(全称 Application Programming Interface:应用程序编程接口) API就是Java帮我们已经写好的一些程序,如类、方法等,可以直接拿过来用 JDK8 API文档:Java Platform SE 8 一. Object Object类的作用 Ob…

mybatis多数据源切换

1.前提 项目中有可能需要去其他的数据库取其他的表的信息 2.思路 2.1 直接使用原生jdbc(不推荐) 2.2 不使用我们全局配置的mybatis,对指定文件夹下使用我们指定的Session 3.解决办法 指定该配置的范围 package com.maycur.openapi.dao.my…

『Linux从入门到精通』第 ㉓ 期 - 管道

文章目录 💐专栏导读💐文章导读🐧进程间通信的目的🐧如何进行进程间通信🐧进程间通信的分类🐧管道🐦什么是管道🐦管道原理 🐧实例代码🐧管道的特点&#x1f4…

Protobuf学习笔记以及序列化的一些概念要点(暂放C++笔记专栏)

Protobuf学习笔记以及序列化的一些概念要点 —— 杭州 2024-03-03 文章目录 Protobuf学习笔记以及序列化的一些概念要点1.Protobuf概念2.实际测试2.1.准备一个test.proto2.2.使用 protoc 命令行工具来编译一个 Protocol Buffers 文件 test.proto3.3.创建一个main.cpp写C++代码…

mysql 事务的隔离级别

一、事务的隔离级别要解决的问题: 1)脏读:读到了其它事务未提交的数据即脏读,未提交意味着数据有可能会被回滚,也就是最终有可能不会存储到数据库中,即读到了最终不一定存在存在的数据,即为脏读…

如何选择程序员职业赛道:挑战与机遇并存的职业探索指南

程序员如何选择职业赛道? 作为程序员,选择职业赛道是一项重要的决策,不仅影响你的职业发展,也影响着你的工作生活。本文将为你介绍如何选择程序员职业赛道,以及每个方向的特点、挑战和机遇,帮助你做出明智…

《极客时间 - 左耳听风》【文章笔记 + 个人思考】

《极客时间 - 左耳听风》 原文链接 :https://time.geekbang.org/column/intro/100002201?tabcatalog 备注:加粗部分为个人思考 01 | 程序员如何用技术变现?(上) 备注:加粗部分为个人思考) 01 | 程序员如何…

Window系统部署Splunk Enterprise并结合内网穿透实现远程访问本地服务

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步,结合cpolar内网穿透工具实现随时随地在任意浏览器,远程访问在本地…