两种单例模式(保证线程安全)
开始前,球球各位读者给个三连吧,有错误感谢指出,谢谢
单例模式也叫单个实例,也就是这个类只有且只能有一个实例对象,这样一个类就叫做“单例”;单例模式有很多种,这里只介绍“饿汉模式”和“懒汉模式”两种;
饿汉模式
唯一实例创建的时机非常早
//饿汉模式
class Singleton{//私有静态的实例对象,外部无法获取,随着类的记载而加载//类对象属性,保证只有一个private static Singleton singleton=new Singleton();//共有的静态方法,外界能够直接直接通过类名访问,获取该单例对象public static Singleton getSingleton(){return singleton;}//私有方法,确保外部无法创建该对象的实例private Singleton(){}
}
public class demo5 {public static void main(String[] args) {Singleton s1= Singleton.getSingleton();Singleton s2= Singleton.getSingleton();//s1,s2指向的是同一个类对象System.out.println(s1==s2);//trueSingleton s3=new Singleton();//报错,外部无法再new一个实例对象}
}
懒汉模式
只有当该类第一次被实例化的才实例化,如果该类没有被实例化就不实例化,且要确保后续无法再次实例化,确保只有一个实例化对象;
//"懒汉模式"
class SingletonLazy{//首先实例对象要设置为空private static SingletonLazy singletonLazy=null;//共有的获取该类唯一实例对象的方法public static SingletonLazy getSingletonLazy(){if(singletonLazy==null){singletonLazy=new SingletonLazy();}return singletonLazy;}//私有的构造方法,外部无法创建该类的实例化对象private SingletonLazy(){}
}
public class demo6 {public static void main(String[] args) {SingletonLazy s1=SingletonLazy.getSingletonLazy();SingletonLazy s2=SingletonLazy.getSingletonLazy();//s1,s2指向的是同一个实例化对象;System.out.println(s1==s2);//true//无法创建实例化对象SingletonLazy s3=new SingletonLazy();}
}
两种模式的最大的区别就是唯一对象创建的实际不同,饿汉模式会在第一个时间创建,只要该类加载内存,唯一实例化对象就随着被创建,而懒汉模式只有当被第一次调用需要实例化对象是才会实例化唯一对象,如果不调用,就不创建;
如果程序中包含多个单例类,使用饿汉模式,刚开始就会扎堆创建很多个单例对象,可能会使得程序启动变慢,如果是懒汉模式,只有当被调用时被会实例化对象,实际是分散的,不容易感觉卡顿;
单例模式一般运用在类只需要一个实例化对象的时候,或者需要避免该类被实例化第二个对象;举个例子:你写的服务器,要从硬盘上加载100G的数据到内存中,肯定要写成一个类,封装上述加载操作,并且写一些获取/处理数据的逻辑方法,这样的类,就因该是单例的,一个实例化就要管理100g的数据,多个实例,就要加载N*100G的数据,这是没有必要,机器也是吃不消的;
单例模式在多线程如何保证线程安全
饿汉模式在多线程是安全的,但是懒汉模式在多线程是不安全的;
饿汉模式是安全的因为在线程还没有创建之前,唯一实例化对象就随着类的加载而创建了,所以后续无论是多少个线程的单例对象指向的都是同一个实例化对象;
懒汉模式之所以在多线程是不安全,是因为在该模式下的实例化对象是在程序运行中被创建的,这其中就有可能多个线程同时实例化对象,不安全那就要加锁,但是加锁在哪里又是一个需要考虑的问题,结合下面两个线程同时实例化对象的可能过程一起来了解一下吧
第一种情况:锁在new对象的时候
第二种情况:锁在判断对象是否为空的时候
第二种情况的优化
第二种情况无疑是可以在一定程度上确保线程安全的,但是针对第二种情况我们还可以再做优化,由于以上例子只是在只有两个线程访问时确保线程安全,如果有多个线程访问,这时候后续的每一个线程在获取实例化对象的,还是每次都要加锁然后再去判断对象是否为空,加锁的开销也是很大的,是一定程度上会拖慢程序的运行的,这使得加锁在一定程度上与低效挂钩,所以第二种情况的优化就是在进行一个判断singletonLazy是否为空,代码如下:
public static SingletonLazy getSingletonLazy(){if(singletonLazy==null){synchronized (singletonLazy){if(singletonLazy==null){singletonLazy=new SingletonLazy();}}}return singletonLazy;}
还有一点补充,虽然这一点不会100%出现,就是编辑器对代码进行了优化,出现内存可见性的情况,即singletonLazy存在寄存器里,当线程创建了该类的唯一实例化对象时,singletonLazy并没有修改指向该对象,所以可以在上volatile关键字;
以下时懒汉模式在多线程依然保持安全完整代码:
//"懒汉模式"
class SingletonLazy{//首先实例对象要设置为空private static volatile SingletonLazy singletonLazy=null;//共有的获取该类唯一实例对象的方法public static SingletonLazy getSingletonLazy(){if(singletonLazy==null){synchronized (singletonLazy){if(singletonLazy==null){singletonLazy=new SingletonLazy();}}}return singletonLazy;}//私有的构造方法,外部无法创建该类的实例化对象private SingletonLazy(){}
}
相关文章:
两种单例模式(保证线程安全)
开始前,球球各位读者给个三连吧,有错误感谢指出,谢谢 单例模式也叫单个实例,也就是这个类只有且只能有一个实例对象,这样一个类就叫做“单例”;单例模式有很多种,这里只介绍“饿汉模式”和“懒…...
开发 Golang 项目的 Docker 化案例
开发 Golang 项目的 Docker 化案例 在这个案例中,我们将展示如何使用 Docker 容器化一个简单的 Golang Web 应用。我们将创建一个基于 Go 的 Hello World 应用,并使用 Docker 和 Docker Compose 管理容器化环境。 1. 创建 Golang Web 应用 首先&#…...
PHP面试宝典之Laravel篇
Laravel简介 Laravel是一种优雅的PHP Web应用程序框架,它具有简洁、优雅的语法,并提供了强大的工具用于构建大型、健壮的应用程序。Laravel采用了现代PHP开发的最佳实践,因此深受开发者欢迎。 Laravel面试常见问题 1. 什么是Laravel中间件…...
自动驾驶仿真:Carsim转向传动比设置
文章目录 一、转向传动比概念二、设置转向传动比1、C factor概念2、Steer Kinematics概念3、传动比计算公式 三、转向传动比验证 一、转向传动比概念 转向传动比(Steering Ratio)表示方向盘转动角度与车轮转动角度之间的关系。公式如下: 转向…...
PyTorch nn.CrossEntropyLoss() 交叉熵损失函数详解和要点提醒
文章目录 前置知识nn.CrossEntropyLoss() 交叉熵损失参数数学公式带权重的公式(weight)标签平滑(label_smoothing) 要点 附录参考链接 前置知识 深度学习:关于损失函数的一些前置知识(PyTorch Loss&#x…...
DW学习笔记|数学建模task2
本章主要涉及到的知识点有: 微分方程的解法如何用 Python 解微分方程偏微分方程及其求解方法微分方程的基本案例差分方程的求解数值计算方法元胞自动机 2.1 微分方程的理论基础 微分方程是什么?如果你参加过高考,可能在高三备考中遇到过这…...
【大数据 复习】第9章 数据仓库分析工具Hive
一、概念 1.概述 (1)Hive是一个构建于Hadoop顶层的数据仓库工具。 (2)某种程度上可以看作是用户编程接口,本身不存储和处理数据。 (3)依赖分布式文件系统HDFS存储数据。 (4…...
ionic7 从安装 到 项目启动最后打包成 apk
报错处理 在打包的时候遇到过几个问题,这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 说明 由于之前使用的是 ionic 3,当时打包的…...
setInterval 定时任务执行时间不准验证
一般在处理定时任务的时候都使用setInterval间隔定时调用任务。 setInterval(() > {console.log("interval"); }, 2 * 1000);我们定义的是两秒执行一次,但是浏览器实际执行的间隔时间只多不少。这是由于浏览器执行 JS 是单线程模式,使用se…...
Stable Diffusion Model网站
Civitai Models | Discover Free Stable Diffusion Modelshttps://www.tjsky.net/tutorial/488https://zhuanlan.zhihu.com/p/610298913超详细的 Stable Diffusion ComfyUI 基础教程(一):安装与常用插件 - 优设网 - 学设计上优设 (uisdc.com)…...
K8S - 实现statefulset 有状态service的灰度发布
什么是灰度发布 Canary Release 参考 理解 什么是 滚动更新,蓝绿部署,灰度发布 以及它们的区别 配置partition in updateStrategy/rollingUpdate 这次我为修改了 statefulset 的1个yaml file statefulsets/stateful-nginx-without-pvc.yaml: --- apiVe…...
Qt 技术博客:深入理解 Qt 中的 delete 和 deleteLater 与信号槽机制
在 Qt 开发中,内存管理和对象生命周期的处理是至关重要的一环。特别是在涉及信号和槽机制时,如何正确删除对象会直接影响应用程序的稳定性。本文将详细讨论在使用 Qt 的信号和槽机制时,delete 和 deleteLater 的工作原理,并给出最…...
自学鸿蒙HarmonyOS的ArkTS语言<一>基本语法
一、一个ArkTs的目录结构 二、一个页面的结构 A、装饰器 Entry 装饰器 : 标记组件为入口组件,一个页面由多个自定义组件组成,但是只能有一个组件被标记 Component : 自定义组件, 仅能装饰struct关键字声明的数据结构 State:组件中的状态变量…...
【OpenGauss源码学习 —— (ALTER TABLE(列存修改列类型))】
ALTER TABLE(列存修改列类型) ATExecAlterColumnType 函数1. 检查和处理列存储表的字符集:2. 处理自动递增列的数据类型检查:3. 处理生成列的类型转换检查:4. 处理生成列的数据类型转换: build_column_defa…...
【大数据 复习】第7章 MapReduce(重中之重)
一、概念 1.MapReduce 设计就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为移动,数据需要大量的网络传输开销。 2.Hadoop MapReduce是分布式并行编程模型MapReduce的开源实现。 3.特点 (1)非共享式,…...
Zookeeper:节点
文章目录 一、节点类型二、监听器及节点删除三、创建节点四、监听节点变化五、判断节点是否存在 一、节点类型 持久(Persistent):客户端和服务器端断开连接后,创建的节点不删除。 持久化目录节点:客户端与Zookeeper断…...
生产级别的 vue
生产级别的 vue 拆分组件的标识更好的组织你的目录如何解决 props-base 设计的问题transparent component (透明组件)可减缓上述问题provide 和 inject vue-meta 在路由中的使用如何确保用户导航到某个路由自己都重新渲染?测试最佳实践如何制…...
kafka(五)spring-kafka(1)集成方法
一、集成 1、pom依赖 <!--kafka--><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId></dependency><dependency><groupId>org.springframework.kafka</groupId><artif…...
Java中的设计模式深度解析
Java中的设计模式深度解析 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在软件开发领域,设计模式是一种被广泛应用的经验总结和解决方案&#x…...
鸿蒙 HarmonyOS NEXT星河版APP应用开发—上篇
一、鸿蒙开发环境搭建 DevEco Studio安装 下载 访问官网:https://developer.huawei.com/consumer/cn/deveco-studio/选择操作系统版本后并注册登录华为账号既可下载安装包 安装 建议:软件和依赖安装目录不要使用中文字符软件安装包下载完成后࿰…...
[FreeRTOS 基础知识] 互斥访问与回环队列 概念
文章目录 为什么需要互斥访问?使用队列实现互斥访问休眠和唤醒机制环形缓冲区 为什么需要互斥访问? 在裸机中,假设有两个函数(func_A, func_B)都要修改a的值(a),那么将a定义为全局变…...
音视频的Buffer处理
最近在做安卓下UVC的一个案子。正好之前搞过ST方案的开机广告,这个也是我少数最后没搞成功的项目。当时也有点客观原因,当时ST要退出机顶盒市场,所以一切的支持都停了,当时啃他家播放器几十万行的代码,而且几乎没有文档…...
【总结】攻击 AI 模型的方法
数据投毒 污染训练数据 后门攻击 通过设计隐蔽的触发器,使得模型在正常测试时无异常,而面对触发器样本时被操纵输出。后门攻击可以看作是特殊的数据投毒,但是也可以通过修改模型参数来实现 对抗样本 只对输入做微小的改动,使模型…...
Linux配置中文环境
文章目录 前言中文语言包中文输入法中文字体 前言 在Linux系统中修改为中文环境,通常涉及以下几个步骤: 中文语言包 更新源列表: 更新系统的软件源列表和语言环境设置,确保可以安装所需的语言包。 sudo apt update sudo apt ins…...
深入解析 iOS 应用启动过程:main() 函数前的四大步骤
深入解析 iOS 应用启动过程:main() 函数前的四大步骤 背景描述:使用 Objective-C 开发的 iOS 或者 MacOS 应用 在开发 iOS 应用时,我们通常会关注 main() 函数及其之后的执行逻辑,但在 main() 函数之前,系统已经为我们…...
textarea标签改写为富文本框编辑器KindEditor
下载 - KindEditor - 在线HTML编辑器 KindEditor的简单使用-CSDN博客 一、 Maven需要的依赖: 如果依赖无法下载,可以多添加几个私服地址: 在Maven框架中加入镜像私服 <mirrors><!-- mirror| Specifies a repository mirror site to…...
高通安卓12-Input子系统
1.Input输入子系统架构 Input Driver(Input设备驱动层)->Input core(输入子系统核心层)->Event handler(事件处理层)->User space(用户空间) 2.getevent获取Input事件的用法 getevent 指令用于获取android系统中 input 输入事件,比如获取按键上报信息、获…...
HTML 事件
HTML 事件 HTML 事件是发生在 HTML 元素上的交互瞬间,它们可以由用户的行为(如点击、按键、鼠标移动等)或浏览器自身的行为(如页面加载完成、图片加载失败等)触发。在 HTML 和 JavaScript 的交互中,事件扮演着核心角色,允许开发者创建动态和响应式的网页。 常见的 HTM…...
Mysql 官方提供的公共测试数据集 Example Databases
数据集:GitHub - datacharmer/test_db: A sample MySQL database with an integrated test suite, used to test your applications and database servers 下载 test_db: https://github.com/datacharmer/test_db/releases/download/v1.0.7/test_db-1.0.7.tar.gz …...
Docker 下载与安装以及配置
安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本: 社区版(Community Edition,缩写为 CE&#x…...
做免费网站推广开头语/单页应用seo如何解决
以下转载自安富莱电子: http://forum.armfly.com/forum.php NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。对于 M3 和 M4 内核的 MCU,每个中断的优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以设置 2^…...
营销型网站是通过对网/品牌广告图片
前提: 电脑上装了 Python , Mathematica 版本 运行RegisterExternalEvaluator["Python", "你的Python.exe 地址"]然后在 NoteBook 界面的空白单元格里 Shift> , 就能看到输入框了.或者点击 号然后就看到了这个来个简单的例子, 用一下 Numpy 库import n…...
宁波好的网站推广软件/珠海网站建设制作
微服务监控需求 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。这些服务可能不同编程语言开发,不同团队开发,可能部署很多副本。因此,就需要一些可以帮助理解系统行为、用于分析性…...
南宁网站制作超薄网络/建站abc
在做开源项目的时候,想传一个gif效果图上去。但是,要有连贯的动画效果。所以,就想到先录制视频,然后视频转gif。但是,用第三录屏软件总是不完美。那么,怎么办呢?android4.4 提供了自带录屏工具&…...
域名备案的网站名称/有没有免费的推广网站
1. 子查询(1)单行子查询(2)多行子查询1)ANY子查询2)ALL 子查询2. 伪列 (ROWID 和 ROWNUM)1. 子查询子查询根据 返回值的记录多少 分为 单行子查询 和 多行子查询(1)单行子查询:不向外部返回结果,或者只返回一行结果,可以使用 、>、、<、…...
忻州市住房城乡建设局网站/网站收录软件
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压、缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经…...