java中的单例模式
一、描述
单例模式就是程序中一个类只能有一个对象实例
举个例子:
//引出单例模式,一个类中只能由一个对象实例
public class Singleton1 {private static Singleton1 instance = new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance() {return instance;}//把构造方法设置私有,防止创建多个线程private Singleton1() {}
}
public class Test1{public static void main(String[] args) {Singleton1 s1 = new Singleton1();}
}
这样写Test1类中Singleton1 s1 = new Singleton1();会报错,因为我们在Singleton1中把构造方法设置了私有
二、单例模式分类
1、饿汉模式
开始我就先给创建出这个实例并且赋值分配空间,代码如下:
public class Singleton1 {private static Singleton1 instance = new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance() {return instance;}
}
2、懒汉模式
在开始不创建这个实例,在第一次调用这个类的时候在创建实例,这样随用随分配空间,代码如下
public class Singleton2 {private static Singleton2 instance = null;//通过这个方法来获取实例public static Singleton2 getInstance() {if(instance==null){instance=new Singleton2();}return instance;}//把构造方法设置私有,防止创建多个线程private Singleton2() {}
}
三、懒汉模式的代码问题
问题一
这是多线程,如果有两个线程分别是a和b,a开始调用这个类的时候instance==null,开始创建实例instance,同时b线程在a还有没有创建完instance的时候也开始调用这个类,判断条件是同样instance==null,也开始创建实例,当两个线程都执行完,就创建了两个实例,违背了单例模式,这是bug!!!

问题一解决方案
其实很简单,我们只需要引入锁就可以,保证判断instance==null和new的对象是一起执行或者都不执行就可以了,代码如下:
public class soltion1 {private static soltion1 instance = null;static Object object=new Object();//通过这个方法来获取实例public static soltion1 getInstance() {synchronized (object){if(instance==null){instance=new soltion1();}}return instance;}//把构造方法设置私有,防止创建多个线程private soltion1() {}
}
有个新的问题,如果a线程创建了instance,但是以后的线程都要加锁,这就造成了cpu创建锁的负担,这是问题二
问题二解决方案
我们只要保证instance为空的时候进来是需要加锁的,别的时候再进来就不用加锁了
public class soltion1 {private static soltion1 instance = null;static Object object=new Object();//通过这个方法来获取实例public static soltion1 getInstance() {if(instance==null){//这个if是判断instance是否为空,synchronized (object){if(instance==null){//这个if是判断时候new新的对象instance=new soltion1();}}}return instance;}//把构造方法设置私有,防止创建多个线程private soltion1() {}
}
到这里我们已经解决了大部分问题了,但是new创建对象的时候是有三部曲:
- 申请内存空间
- 在内存空间上构造对象
- 把内存的地址,赋值给instance引用

上述描述这是问题三
问题三解决方案
加volatile,保证instance再修改时不会出现指令重排序情况
private volatile static soltion1 instance = null;
总结
public class soltion1 {private volatile static soltion1 instance = null;static Object object=new Object();//通过这个方法来获取实例public static soltion1 getInstance() {if(instance==null){//这个if是判断instance是否为空,synchronized (object){if(instance==null){//这个if是判断时候new新的对象instance=new soltion1();}}}return instance;}//把构造方法设置私有,防止创建多个线程private soltion1() {}
}
相关文章:
java中的单例模式
一、描述 单例模式就是程序中一个类只能有一个对象实例 举个例子: //引出单例模式,一个类中只能由一个对象实例 public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance…...
pytorch笔记篇:pandas之数据预处理(更新中)
pytorch笔记篇:pandas之数据预处理 pytorch笔记篇:pandas之数据预处理(更新中)测试例代码相关的算子 pytorch笔记篇:pandas之数据预处理(更新中) 测试例代码 print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]]) # (※1) 为什么test_da…...
【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案
政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议,决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调:向科技要战斗力,加快推进“智慧消防”建设不断提升火灾防控…...
数据分析之POWER Piovt透视表分析
将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份,鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份,借助month的函数双击日期 选择月份这列----按列排序-----选择月…...
机器人寻路算法双向A*(Bidirectional A*)算法的实现C++、Python、Matlab语言
机器人寻路算法双向A*(Bidirectional A*)算法的实现C、Python、Matlab语言 最近好久没更新,在搞华为的软件挑战赛(软挑),好卷只能说。去年还能混进32强,今年就比较迷糊了,这东西对我…...
智慧公厕产品的特点、应用场景
随着城市化进程的加速和智能科技的不断发展,智慧公厕作为城市管理的重要组成部分,逐渐成为了现代城市的一道靓丽风景线。它的特点和应用场景备受人们关注和喜爱。 智慧公厕的特点有哪些呢?首先,它智能化的设备和感应技术为其特点…...
vue 插槽(二)
渲染作用域 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在父组件模板中定义的。举例来说: <span>{{ message }}</span> <FancyButton>{{ message }}</FancyButton> 这里的两个 {{ message }} 插值表达式渲染…...
【Java】MyBatis快速入门及详解
文章目录 1. MyBatis概述2. MyBatis快速入门2.1 创建项目2.2 添加依赖2.3 数据准备2.4 编写代码2.4.1 编写核心配置文件2.4.2 编写SQL映射文件2.4.3 编写Java代码 3. Mapper代理开发4. MyBatis核心配置文件5. 案例练习5.1 数据准备5.2 查询数据5.2.1 查询所有数据5.2.2 查询单条…...
Matlab将日尺度数据转化为月尺度数据
日尺度转化为月尺度 clcclear all% load datadata xlread(data.xlsx) % 例如该数据为1961-01-01至2022-12-31,共计22645天data data(:,1:3) % 该数据有22645行,数据分别为降水,气温,湿度等三列dt datetime(1961-01-01):datatim…...
【技巧】PyTorch限制GPU显存的可使用上限
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 从 PyTorch 1.4 版本开始,引入了一个新的功能 torch.cuda.set_per_process_memory_fraction(fraction, device),这个功能允许用户为特定的 GPU 设备设置进程可使用的显存上限比例。 测试代…...
深度理解文件操作
目录 文件 文件名: 标准流 文件指针 文件的打开和关闭 文件的顺序读写: 使用部分 文件的打开和关闭 文件 文件分两种,第一种是程序文件,后一种是数据文件。 程序文件:包括源程序文件(后缀为.c&…...
【搜索引擎2】实现API方式调用ElasticSearch8接口
1、理解ElasticSearch各名词含义 ElasticSearch对比Mysql Mysql数据库Elastic SearchDatabase7.X版本前有Type,对比数据库中的表,新版取消了TableIndexRowDocumentColumnmapping Elasticsearch是使用Java开发的,8.1版本的ES需要JDK17及以上…...
配置小程序的服务器域名
准备工作 拥有一个已注册的域名:确保您已经注册了一个符合国家和地区相关法律法规要求的域名。 完成域名备案(如有必要):根据国家和地区的法律法规,某些情况下可能需要对域名进行备案才能用于互联网服务。 配置 DNS&…...
政安晨:【深度学习神经网络基础】(一)—— 逐本溯源
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 与计算机一样的古老历史 神经网络的出现可追溯到20世纪40年…...
技巧 Win10电脑打开SMB协议共享文件,手机端查看
一. 打开 SMB1.0/CIFS文件共享支持 ⏹如下图所示,打开SMB1.0/CIFS文件共享支持 二. 开启网络发现 ⏹开启网络发现,确保共享的文件能在局域网内被发现 三. 共享文件夹到局域网 ⏹根据需要勾选需要共享的文件夹,共享到局域网 四. 共享文件查…...
java实现MP4视频压缩
要在Java中实现MP4视频压缩,您可以使用一些第三方库,比如ffmpeg或Xuggler等。下面是使用ffmpeg库进行MP4视频压缩的示例代码: java import java.io.BufferedReader; import java.io.InputStreamReader; public class MP4Compressor { public static void main(String[] args)…...
云电脑安全性怎么样?企业如何选择安全的云电脑
云电脑在保障企业数字资产安全方面,采取了一系列严谨而全面的措施。随着企业对于数字化转型的深入推进,数字资产的安全问题日益凸显,而云电脑作为一种新兴的办公模式,正是为解决这一问题而生。云电脑安全吗?可以放心使…...
【python】pygame游戏框架
文章目录 pygame常用模块pygame:主模块,包含初始化、退出、时间、事件等函数。pygame.cdrom 访问光驱pygame.cursors 加载光驱pygame.joystick 操作游戏手柄或者类似的东西pygame.mouse:鼠标模块,包含获取、设置、控制等函数。pygame.key 键盘模块pygame.display:显示模块…...
计算机OSI7层协议模型
OSI模型是由国际标准化组织(ISO)制定的一种网络通信的标准体系,旨在确保不同厂商的网络设备能够互联互通。该模型将网络通信划分为七个独立的层次,每一层负责特定的功能。这种分层设计使得网络协议的开发、维护和升级更加容易。 …...
书生·浦语大模型实战营之全链路开源体系
书生浦语大模型实战营之全链路开源体系 为了推动大模型在更多行业落地开花,让开发者们更高效的学习大模型的开发与应用,上海人工智能实验室重磅推出书生浦语大模型实战营,为广大开发者搭建大模型学习和实践开发的平台,两周时间带…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
