当前位置: 首页 > news >正文

单例模式写法的总结(保证线程安全)

首先,单例模式分为饿汉模式和懒汉模式

单例模式有什么用呢?

可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便的控制了实例个数,并节约系统资源。

例如:DataSource(JDBC中)类对象只需要一个。

饿汉模式:知道你很饿,所以提前给你准备好了,于是在类加载的过程中创建实例,所以就写在static代码块中,和类一起加载。

static class Singleton {private static Singleton singleton = new Singleton();private Singleton() {}public static Singleton getSingleton() {return singleton;}}

懒汉模式:知道你很饿,但是当你第一次需要的时候我再给你,不需要的时候是没有我的实例对象给你调用的,这个实例对象通常由方法中创建,由方法来返回。

class Singleton {private static Singleton singleton = null;private Singleton() {}public static Singleton getSingleton() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

其中很关键的一步是private Singleton() {}这一句代码,让其他类没法调用它的构造方法。

因为饿汉模式提前创建好了,所以天生就是线程安全的。

而懒汉模式是需要才创建,那么多个线程中同时需要会怎么办?会不会出现线程安全问题?

会的,如果多个线程中同时调用getSingleton方法,那么就有可能同时创建出多个实例对象。

那么怎么解决这个线程安全问题呢?

使用synchronized关键字

public synchronized static Singleton getSingleton() {if (singleton == null) {singleton = new Singleton();}return singleton;}

能不能再改进一下?

为了解决线程安全性的可见性问题,使用volatile关键字

另外,再使用双重if语句判断,降低锁竞争的频率

private static volatile Singleton singleton = null;public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}

相关文章:

单例模式写法的总结(保证线程安全)

首先,单例模式分为饿汉模式和懒汉模式 单例模式有什么用呢? 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便的控制了实例个数,并节约系统资源。 例如:DataSource&#x…...

SQL Server 查询数据并汇总相关技巧 23.08.08

GROUPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择…...

第一章 SpringBoot 介绍-最小配置

1. spring-boot web应用的最小配置 1.1 pom配置两个依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version></parent><depende…...

10-1_Qt 5.9 C++开发指南_Data Visualization实现数据三维显示

Data Visualization 是 Qt 提供的用于数据三维显示的模块。在 Qt 5.7 以前只有商业版才有此模块&#xff0c;而从Qt5.7 开始此模块在社区版本里也可以免费使用了。Data Visualization 用于数据的三维显示&#xff0c;包括三维柱状图、三维空间散点、三维曲面等。Data Visualiza…...

[保研/考研机试] KY87 鸡兔同笼 北京大学复试上机题 C++实现

描述 一个笼子里面关了鸡和兔子&#xff08;鸡有2只脚&#xff0c;兔子有4只脚&#xff0c;没有例外&#xff09;。已经知道了笼子里面脚的总数a&#xff0c;问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入描述&#xff1a; 每组测试数据占1行&#xff0c;…...

Jmeter快捷方式和应用图标设置

很多人在安装Jmeter,安装到本机却没有icon&#xff0c;每次使用的时候&#xff0c;每次打开应用都要找目录&#xff0c;不太方便。 【解决问题】 使用bin路径下的一个.bat文件&#xff0c;创建快捷方式。 【操作步骤】 Step1、将Jmeter 安装bin路径下的jmeter.bat 发送快捷方…...

PHP sm4国密加密解密文件

<?php // 打开要加密的 PDF 文件 $sourceFilePath path/to/source.pdf; $encryptedFilePath path/to/encrypted.pdf; $decryptedFilePath path/to/decrypted.pdf;// 生成一个 AES 密钥&#xff08;256 位&#xff09; $key random_bytes(32);// 选择一个加密模式&#…...

CBCGPRibbon 添加Edit、Combox、Hyperlink控件

编辑框、下拉框、网址按钮等是我们常用的控件&#xff0c;对应的类是 CBCGPRibbonEdit CBCGPRibbonComboBox CBCGPRibbonHyperlink 使用实例如下&#xff1a; //Edit CBCGPRibbonEdit* pEdit new CBCGPRibbonEdit(2001, 200); pEdit->SetReadOnly(TRUE); …...

漫话拥塞控制:BBR 是个单流模型

概要(便于检索主题)&#xff1a;单流&#xff0c;多流收敛&#xff0c;probe buffer 挤压带宽&#xff0c;maxbw-filter wnd。 我曾经经常说 BBR 是个单流模型&#xff0c;而不是多流收敛模型&#xff0c;也做过不少评论&#xff0c;最近在复听 IETF 的大会&#xff0c;在 IET…...

HTML详解连载(1)

HTML详解连载&#xff08;1&#xff09; HTML定义HTML 超文本标记语言标签语法注意拓展 HTML基本骨架解释VS Code 快速生成骨架&#xff1a;标签的关系父子关系&#xff08;嵌套关系&#xff09;兄弟关系&#xff08;并列关系&#xff09; 代码格式注释 标题标签标签名:h1-h6(双…...

最新版本2023UI千月影视APP源码 开源完美版前后端完美匹配 后端基于ThinkPHP框架

最新版本的2023UI千月影视APP源码是一款开源的完美版应用程序&#xff0c;具备前后端完美匹配的特点。该应用的后端开发基于ThinkPHP框架&#xff0c;这是一个广泛使用的PHP开发框架&#xff0c;具有稳定性和安全性方面的优势。 2023UI千月影视APP是一款提供电影、电视剧、综艺…...

centos7安装Docker详细步骤(无坑版教程)

一、安装前必读 在安装 Docker 之前&#xff0c;先说一下配置&#xff0c;我这里是Centos7 Linux 内核&#xff1a;官方建议 3.10 以上&#xff0c;3.8以上貌似也可。 注意&#xff1a;本文的命令使用的是 root 用户登录执行&#xff0c;不是 root 的话所有命令前面要加 sudo…...

Python入门自学进阶-Web框架——39、redis、rabbitmq、git——2

RabbitMQ的exchange&#xff0c;即交换机有不同的类型&#xff1a; 1.direct Exchange(直接交换机) 匹配路由键&#xff0c;只有完全匹配消息才会被转发 2.Fanout Excange&#xff08;扇出交换机&#xff09; 将消息发送至所有的队列 3.Topic Exchange(主题交换机) 将路由按模…...

了解IL汇编跳转语句

il代码&#xff0c; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 5.entrypointldstr "Enter First Number"call void [mscorlib]System.Console::WriteLine (string)call string …...

JVM运行时五大数据区域详解

前言&#xff1a; java虚拟机再执行Java程序的时候把它所拥有的内存区域划分了若干个数据区域。这些区域有着不同的功能&#xff0c;各司其职。这些区域不但功能不同&#xff0c;创建、销毁时间也不同。有些区域为线程私有&#xff0c;如&#xff1a;每个线程都有自己的程序计数…...

Vuex 使用教程

Vuex 各子模块的内部结构及作用 这是vuex的内部代码结构&#xff0c;所有的子模块都是一样的 state&#xff1a;存放数据状态&#xff1b; action&#xff1a;指派 mutation &#xff1b; mutation&#xff1a;修改state里面的状态&#xff1b; getter&#xff1a;侧重于对数据…...

springboot启动you will need to add ‘org.slf4j‘ to prefer-application-packages异常解决

摘自个人印象笔记2020-09-12内容&#xff1a;[https://app.yinxiang.com/fx/6c3c7d9d-d5e5-4e5b-b2a1-33d6f29c48a7](https://app.yinxiang.com/fx/6c3c7d9d-d5e5-4e5b-b2a1-33d6f29c48a7) 启动异常&#xff1a; Caused by: java.lang.IllegalArgumentException: LoggerFactory…...

云原生核心原则和特征

云原生&#xff08;Cloud Native&#xff09;是一种软件开发和部署方法论&#xff0c;旨在充分利用云计算的优势来构建和管理应用程序。云原生应用程序是专为在云环境中设计、构建和运行的应用程序。 以下是云原生的一些核心原则和特征&#xff1a; 微服务架构&#xff1a;云…...

【ElasticSearch入门】

目录 1.ElasticSearch的简介 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群&#xff0c;ES是一个分布式的系统 3.3 Node节点&#xff0c;就是集群中的一台服务器 3.4 index 索引&#xff08;索引库&#xff09; 3.5 type类型 3.6 doc…...

SQL | 注释

2-注释 2.1-单行注释 select prod_name -- 这是一条行内注释 from products; 使用两个连字符(-- ) 放在行内&#xff0c;两个连字符后的内容即为注释内容。 # 这是一条注释 select prod_name from products; 这种注释方式可能有些数据库不支持&#xff0c;所以使用前应该…...

仅限首批GCC 14.3+Clang 19.0开发者访问:C++26反射AST遍历器底层内存布局与constexpr反射缓存机制(附可运行benchmark)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;C26反射特性在元编程中的应用源码分析 C26 正式引入静态反射&#xff08;static reflection&#xff09;核心设施&#xff0c;基于 std::reflexpr 和 meta::info 类型系统&#xff0c;使编译期类型 int…...

量子投票协议:原理、实现与噪声分析

1. 量子投票协议的基本原理与实现量子投票协议是一种利用量子力学特性来优化传统投票系统的新型决策机制。在经典投票系统中&#xff0c;每个选民独立表达自己的偏好&#xff0c;而量子投票则通过量子态的叠加和纠缠特性&#xff0c;实现了选民偏好之间的量子关联。这种关联性为…...

前端安全的 Content Security Policy (CSP):从理论到实战

前端安全的 Content Security Policy (CSP)&#xff1a;从理论到实战 为什么 CSP 如此重要&#xff1f; 在当今前端开发中&#xff0c;安全问题已经成为不可忽视的重要因素。XSS&#xff08;跨站脚本攻击&#xff09;、CSRF&#xff08;跨站请求伪造&#xff09;等安全威胁时…...

SQLGlot:统一多数据库SQL解析与转换的终极解决方案

SQLGlot&#xff1a;统一多数据库SQL解析与转换的终极解决方案 【免费下载链接】sqlglot Python SQL Parser and Transpiler 项目地址: https://gitcode.com/gh_mirrors/sq/sqlglot SQLGlot是一个功能强大的Python SQL解析器和转换器&#xff0c;它能够帮助开发者轻松处…...

MDCX Docker容器化部署深度解析:从源码到生产环境的完整实战手册

MDCX Docker容器化部署深度解析&#xff1a;从源码到生产环境的完整实战手册 【免费下载链接】mdcx-docker 在Docker容器中运行 MDCX&#xff0c;并通过Web界面或远程桌面进行控制。Run MDCX in a Docker container, accessible and controllable via a web interface or remo…...

别再傻傻print了!用tqdm给你的Python脚本加个进度条,代码瞬间专业

告别print调试&#xff01;用tqdm打造专业级Python进度监控系统 在数据处理和批量任务中&#xff0c;我们常常需要监控长时间运行的循环进度。传统print语句虽然简单直接&#xff0c;但会导致终端输出混乱、难以估算剩余时间&#xff0c;更无法在Jupyter等环境中提供优雅的交互…...

如何让无导航的PDF文档拥有智能目录?pdfdir一键生成书签解决方案

如何让无导航的PDF文档拥有智能目录&#xff1f;pdfdir一键生成书签解决方案 【免费下载链接】pdfdir PDF导航&#xff08;大纲/目录&#xff09;添加工具 项目地址: https://gitcode.com/gh_mirrors/pd/pdfdir 在数字化阅读时代&#xff0c;PDF文档已成为我们工作学习中…...

VSCode 2026内存优化实战手册,从3.8GB→892MB:基于V8 Heap Snapshot+Process Explorer双工具链的精准定位法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 2026内存优化实战导论 随着 VSCode 2026 版本正式引入基于 WebAssembly 的轻量内核&#xff08;vscode-core-wasm&#xff09;与分层内存回收机制&#xff0c;开发者在大型前端项目、多语言工作…...

iOS与tvOS非越狱自定义工具Misaka深度解析与实战指南

iOS与tvOS非越狱自定义工具Misaka深度解析与实战指南 【免费下载链接】misaka iOS & tvOS customisation tool for KFD & MDC 项目地址: https://gitcode.com/gh_mirrors/mis/misaka Misaka是一款面向iOS和tvOS设备的革命性自定义工具&#xff0c;它通过KFD和M…...

别再只用MD5存密码了!聊聊Java里那些更安全的替代方案(附Bcrypt/Argon2代码示例)

Java密码存储安全升级&#xff1a;从MD5到Bcrypt/Argon2的实战指南 密码存储的危机时刻 三年前&#xff0c;某社交平台因使用MD5存储用户密码导致600万账户泄露。攻击者仅用48小时就破解了其中92%的密码——这不是电影情节&#xff0c;而是每天都在发生的安全事件。作为Java开发…...