多线程案例-单例模式
单例模式是设计模式之一,能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例
单例模式的具体实现方法有很多,最常见的是 “饿汉” 和 “懒汉” 两种。
饿汉模式
class Singlenton{private static Singlenton instance = new Singlenton();public static Singlenton getInstance(){return instance;}//在此类的外面无法调用构造方法,无法创建实例private Singlenton(){}
}
懒汉模式
类加载的时候不创建实例,第一次使用的时候才创建实例
单线程版
class Singletonlazy{private static Singletonlazy instance = null;public static Singletonlazy getInstance(){if(instance==null){instance = new Singletonlazy();}return instance;}private Singletonlazy(){}
}
多线程版
相比单线程版,多线程版考虑了线程安全问题
线程安全问题发生在首次创建实例时,可能多个线程同时调用getInstance方法,就可能导致创建了多个实例。
加上 synchronized 可以改善线程安全问题
class Singletonlazy{private static Singletonlazy instance = null;private static Object locker = new Object();public static Singletonlazy getInstance(){synchronized (locker){if(instance==null){instance = new Singletonlazy();}}return instance;}private Singletonlazy(){}
}
多线程版优化
上面的代码虽然说解决了线程安全问题,但是只要调用了getInstance方法,就会触发加锁操作,产生阻塞,影响性能。
我们想要优化,就要在加锁之前判定一下是否需要加锁。
外层的if(instance==null)是判断实例有没有创建
内层的if(instance==null)进一步判断实例有没有创建,因为在外层 if 和加锁之间,切换了线程并创建了实例,此时切换到原来的线程如果没有判断,就会创建出多个实例。
但是光加了一个外层 if 还不够,此时可能因为指令重排序引起的线程安全问题
instance = new Singletonlazy();分为三条指令
- 分配内存空间
- 执行构造方法
- 内存空间的地址赋值给引用变量
编译器可能按照 1 2 3 的顺序来执行,也可能按照 1 3 2 的顺序执行
当按照 1 3 2的顺序执行时,由于 3 是把内存空间的地址赋值给引用变量,所以此时 instance现在不为 null 了,此时如果其他线程判断外层 if 时,由于instance不为null了,所以直接返回instance,但是此时instance指向没有初始化,上面值全是0的内存,此时getInstance到的就是个错误的值,会引发一系列不可预期的情况。
此时,我们用volatile 关键字告知编译器此变量指令不可重排序即可解决。
class Singletonlazy{private static volatile Singletonlazy instance = null;private static Object locker = new Object();public static Singletonlazy getInstance(){if(instance==null){synchronized (locker){if(instance==null){instance = new Singletonlazy();}}}return instance;}private Singletonlazy(){}
}
相关文章:
多线程案例-单例模式
单例模式是设计模式之一,能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例 单例模式的具体实现方法有很多,最常见的是 “饿汉” 和 “懒汉” 两种。 饿汉模式 class Singlenton{private static Singlenton instance new Sin…...
P6 优化篇 - 数据折线图可视化步骤
增加新页面, 则需要在 page.json里面增加页面信息 2.添加目录, 和路径 同时也要添加目录了 , 新建目录LineChart , 添加文件LineChart.vue 4.LineChart.vue 直接复制黏贴 <template><view class"container"><!-- 图表显示区域 --><view cla…...
优选算法之二分查找(上)
目录 一、二分查找 1.题目链接:704. 二分查找 2.题目描述: 3.算法流程: 4.算法代码: 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…...
JavaScript(16)——定时器-间歇函数
开启定时器 setInterval(函数,间隔时间) 作用:每隔一段时间调用这个函数,时间单位是毫秒 例如:每一秒打印一个hello setInterval(function () { document.write(hello ) }, 1000) 注:如果是具名函数的话不能加小括号…...
VUE中的重点*
1.MVC 和 MVVM的区别? MVC:M(model数据)、V(view视图),C(controlle控制器) 缺点是前后端无法独立开发,必须等后端接口做好了才可以往下走; 前端没…...
rabbitmq生产与消费
一、rabbitmq发送消息 一、简单模式 概述 一个生产者一个消费者模型 代码 //没有交换机,两个参数为routingKey和消息内容 rabbitTemplate.convertAndSend("test1_Queue","haha");二、工作队列模式 概述 一个生产者,多个消费者&a…...
spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j
1.简介 OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后,Swagger规范正式更名为OpenAPI规范,并且根据OpenAPI规范的版本号进行了更新。因此,Swagger 3.0对应的就是OpenAPI 3.0版本,它是Swagger在OpenAPI阶段推出的一个…...
SM2隐式证书用户公私钥生成python代码实现
GMT0130-2023具体描述基于SM2算法的隐式证书公钥机制,这里尝试Python代码实现密钥生成部分功能,具体如下,椭圆曲线计算实现使用python第三方包gmssl。 #生成用户私钥Da和公钥Pa,其中Da(tAdA)mod N,Pa可以直…...
IEC104转MQTT网关快速实现了IEC104到MQTT的转换和数据交互
随着智能电网技术的不断进步,IEC 104(IEC 60870-5-104)协议作为电力系统中重要的远动通信标准,正逐步融入更广泛的物联网生态系统中。亚马逊AWS(Amazon Web Services),作为全球领先的云计算服务…...
【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)
调节图片对比度和亮度(像素变换) 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法,请参阅本专栏的其…...
web UI自动化测试 浏览器模式设置
自动化之浏览器模式设置 做selenium UI自动化测试时,每次都需要启动浏览器、用例运行结束后再关闭浏览器,浏览器启动相当地耗费时间,在本机运行用例的话还得放开双手,可以使用chrome的headless模式,让浏览器在后台运行…...
OpenCV图像滤波(1)双边滤波函数bilateralFilter的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术,特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传…...
前端开发使用Big.js精算避免误差
1、下载 npm install big.js 全局引入还是局部引入可根据项目框架及个人需求 2、静态引入 < script src https://unpkg.com/big.js6.0.0/big.mjs > </ script > 或者 import Big from https://raw.githubusercontent.com/mikemcl/big.js/v6.0.0/big.mjs; i…...
在 Ubuntu 22.04/20.04 安装 CVAT 和 SAM 指南
1. 安装 Docker 和 Docker Compose sudo apt-get update sudo apt-get --no-install-recommends install -y \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-ke…...
【SpringCloud】 微服务分布式环境下的事务问题,seata大合集
目录 微服务分布式环境下的事务问题 分布式事务 本地事务 BASE理论与强弱一致性 BASE理论 强弱一致性 常见分布式事务解决方案 - 2PC 常见分布式事务解决方案 - TCC 常见分布式事务解决方案 - 最大努力通知 常见分布式事务解决方案 - 最终一致性 Seata介绍与术语 Seata…...
vite5+vue3开发阅读APP实战笔记20240725
目前界面长成这样: 配置别名 修改vite.config.js import {defineConfig} from vite import vue from vitejs/plugin-vue import path from "path"// https://vitejs.dev/config/ export default defineConfig({server: {open: true,port: 8088,},plug…...
Intel任命Micron技术开发主管领导Intel Foundry制造运营
- **新闻要点**:Intel聘请了Micron的技术开发主管Dr. Naga Chandrasekaran担任首席全球运营官、执行副总裁以及Intel Foundry制造和供应链组织的总经理。他将负责Intel的所有制造运营事务。 #### 任命背景 - **领导团队**:Chandrasekaran将成为Intel执行…...
苹果发布iOS 18 Beta 4,新增CarPlay 壁纸等多项功能改进
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 iOS 18 Beta 4:新功能与改进的探索 苹果公司在2024年7月9日向开发者推送了iOS 18的第四个开发者预览版Beta 4更新,内部…...
谷粒商城实战笔记-50-51-商品分类的删除
文章目录 一,50-商品服务-API-三级分类-删除-逻辑删除1,逻辑删除的配置1.1 配置全局的逻辑删除规则(可省略)1.2 配置逻辑删除Bean(可省略)1.3 Bean相应字段上加上注解TableLogic 2,后台接口开发…...
vue3+g2plot实现词云图
词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…...
Qwen3-ForcedAligner-0.6B入门必看:start_time为0.00s的边界条件处理
Qwen3-ForcedAligner-0.6B入门必看:start_time为0.00s的边界条件处理 1. 为什么需要关注边界条件 当你使用Qwen3-ForcedAligner-0.6B进行音文对齐时,可能会遇到一个看似简单但很重要的问题:为什么有些词的开始时间是0.00秒?这种…...
别再只调包了!深入对比VGG16、ResNet等9大模型在农业病害识别上的实战表现(附数据集)
深度视觉模型在农业病害识别中的实战评测:从特征提取到部署优化的全流程解析 当一片叶子出现褐色斑点时,农民往往需要等待数天才能获得实验室检测结果——这种传统诊断方式的滞后性,每年造成全球约20-40%的农作物损失。计算机视觉技术的突破正…...
C++ constexpr 在工程中的应用场景
C constexpr 在工程中的应用场景 在现代C开发中,constexpr关键字因其强大的编译时计算能力,逐渐成为提升性能与代码可维护性的利器。它允许开发者在编译期完成复杂的计算和初始化,从而减少运行时开销,同时增强代码的静态安全性。…...
5分钟搞定专业级黑苹果配置:OpCore Simplify智能工具让复杂EFI构建化繁为简
5分钟搞定专业级黑苹果配置:OpCore Simplify智能工具让复杂EFI构建化繁为简 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 开篇痛点直击&…...
UNIT-00:Berserk Interface辅助数据库课程设计:从ER图到SQL
UNIT-00:Berserk Interface辅助数据库课程设计:从ER图到SQL 你是不是正在为数据库课程设计发愁?面对一个模糊的业务需求,要从零开始画出清晰的ER图,再设计出规范化的数据库模式,最后还要写出一堆建表和查询…...
Datart BI 工具数据库连接优化:解决 wait millis 5001 报错与连接池配置调整
1. 遇到 wait millis 5001 报错怎么办? 最近在帮客户部署 Datart BI 工具时,遇到了一个典型的数据库连接问题。每天早上业务高峰期,系统日志里就会频繁出现"wait millis 5001"的报错,但奇怪的是直接登录数据库服务器检查…...
数字古籍获取:高效工具使用指南
数字古籍获取:高效工具使用指南 【免费下载链接】bookget bookget 数字古籍图书下载工具 项目地址: https://gitcode.com/gh_mirrors/bo/bookget 当你在研究清代方志时,面对图书馆网站繁琐的翻页操作和分散的资源链接,是否渴望一种能批…...
【PyCon官方认证异步实践标准】:基于aiohttp+uvloop+trio的工业级异步架构设计(含GitHub千星项目源码解析)
第一章:Python异步I/O的核心范式与演进脉络Python异步I/O并非一蹴而就的产物,而是从回调驱动、协程模拟,到原生语法支持的渐进式演进结果。其核心范式始终围绕“单线程并发执行I/O密集型任务”这一目标展开——通过事件循环调度可暂停/恢复的…...
SAMD51平台CAN FD驱动:零拷贝、位定时计算与FreeRTOS集成
1. 项目概述ACANFD_FeatherM4CAN 是专为 Adafruit Feather M4 CAN Express 开发板设计的高性能 CAN FD(Controller Area Network with Flexible Data)驱动库。该库直接面向硬件抽象层,深度适配 SAMD51 微控制器内置的双 CAN FD 模块ÿ…...
从理论到实践:双有源桥DAB-SPS控制模式仿真全解析
1. 双有源桥DAB与SPS控制模式入门 第一次接触双有源桥(Dual Active Bridge,简称DAB)时,我被它优雅的对称结构吸引住了。这种DC-DC变换器拓扑就像一座精心设计的桥梁,两侧各有一个全桥电路,通过高频变压器耦…...
