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)制定的一种网络通信的标准体系,旨在确保不同厂商的网络设备能够互联互通。该模型将网络通信划分为七个独立的层次,每一层负责特定的功能。这种分层设计使得网络协议的开发、维护和升级更加容易。 …...
书生·浦语大模型实战营之全链路开源体系
书生浦语大模型实战营之全链路开源体系 为了推动大模型在更多行业落地开花,让开发者们更高效的学习大模型的开发与应用,上海人工智能实验室重磅推出书生浦语大模型实战营,为广大开发者搭建大模型学习和实践开发的平台,两周时间带…...
/.git/config文件目录
git config可以看做是一个配置工具,它允许用户获得和设置与git相关的配置选项,是我们灵活使用git软件的第一步...
MySQL 8.0 新特性之不可见主键
数据库设计通常需要满足一定的范式要求,其中主键更是最基本的要求。不过,数据库管理系统却允许我们创建没有主键的表。这样的表在 MySQL 中会带来查询性能低下、复制延迟甚至无法实现高可用配置等问题。 为此,MySQL 8.0.30 版本引入了一个新…...
kubernetes-networkpolicies网络策略问题
kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点,查看我的博客CKA考题,里面能找到解决方法 1.部署prometheus监控的时候,都部署成功,但是web访问503-504超时 2.添加ingress的时候也是访问不到,其他命…...
wps没保存关闭了恢复数据教程
有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失,不知道wps没保存关闭了怎么恢复数据,其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能,不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…...
Android9.0以后不允许HTTP访问的解决方案
背景 自 Android 9.0 起,默认禁止使用 HTTP 进行访问。当尝试使用 HTTP 链接时,将会收到以下错误信息: "Cleartext HTTP traffic to " host " not permitted"为了解决这一问题,下面介绍两种破解方法&…...
nvm安装以后,node -v npm 等命令提示不是内部或外部命令
因为有vue2和vue3项目多种,所以为了适应各类版本node,使用nvm管理多种node版本,但是当我按教程安装nvm以后,nvm安装以后,node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址:https://github.com/coreybutler/…...
SBA架构5G核心网
SBA(Service Based Architecture)架构是一种面向服务的架构,旨在提供更灵活、更可扩展、更容易部署和管理的解决方案。在电信领域,SBA架构被广泛应用于5G核心网和下一代网络的设计中。 在卫星互联网核心网的总体技术要求中&#…...
上位机图像处理和嵌入式模块部署(qmacvisual图像拼接)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 qmacvisual本身提供了图像拼接的功能。功能本身比较有意思的。大家如果拍过毕业照,特别是那种几百人、上千人的合照,应该就…...
关于对postcss安装和使用比较详细
PostCSS是一款强大的CSS工具,它可以自动解析CSS代码,应用一系列的插件,然后输出转换后的CSS。PostCSS本身是一个功能相对简单的工具,但它的强大之处在于其插件生态系统,这些插件提供了各种各样的功能,如自动…...
uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度
上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…...
青岛cms建站系统/seo是干啥的
自己编写了一个工具类,处理页面提交json格式数据到后台,再进行处理成Java对象数据 1、DTO:Data Transfer Object,数据传送对象 2、对于日期格式的问题,也已经处理 3、json-lib-2.2.2-jdk13.jar (2.1在日期数…...
如何快速自己做网站/网络销售怎么聊客户
转载至:http://blog.csdn.net/denglxsc/article/details/51188444 在开发过程中对程序方法、类的描述不仅方便阅读、更能体现一个良好的编码习惯,但是自带的文档注释快捷键以及自动生成的注释总是不够完美,既然不完美,那么我们就…...
全球最好的黄页网站/域名解析ip
如果对您有帮助,请点赞告诉我,如果没有解决您的疑惑,请您留言,我陪您一起努力解决!这里只介绍常用的一些概念,一些极少用到的概念为避免混淆这里不做介绍。 简单的来说,BLE的服务端属性数据库可…...
珠海政府网站大湾区建设/济南网站seo哪家公司好
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ConditionCommunication {/*** 这一个示例的学习应该和传统的线程通信相互对比,Condition的通信优点查看文…...
国务院网站官网建设部/免费快速网站
前言 volitate是Java虚拟机提供的轻量级同步机制关键字,但是无法保证线程安全 注意三点:保证可见性、不保证原子性、禁止进行指令重排序。 volatile关键字特性 保证可见性 线程有工作内存,在操作一个变量的时候,会先去主内存…...
南京做网站公司 雷仁/西安百度推广开户运营
每一种计算机语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,php也不例外,但是在面向对象编程(OOP)编程中,有些对象需要显式的销毁;防止程序执行内存溢出。 一、PHP 垃圾回收机制(Garbage Collector 简称GC) 在…...