多线程---单例模式

文章目录

  • 什么是单例模式?
  • 饿汉模式
  • 懒汉模式
    • 版本一:最简单的懒汉模式
    • 版本二:考虑懒汉模式存在的线程安全问题
    • 版本三:更完善的解决线程安全问题
    • 版本四:解决指令重排序问题

什么是单例模式?

单例模式:是一种常见的设计模式。即:一些大佬针对一些常见的需求场景,整理出来的一些解决方案。我们只需要套用模式就可以解决问题,极大的便利了我们的开发。

具体来说,单例模式就要求某个类只能有一个实例。

那在Java中怎么实现呢?
我们就会想到“static”这个关键字,static修饰的成员/属性就会变成类成员/属性。当属性变成类属性的时候其实就已经是“单例”的了。因为,JVM在加载类的时候只加载一次,这个类是“单例”的,那么它包含的属性更是“单例”的。

借助static实现“单例模式”有两种模式:饿汉模式和懒汉模式

饿汉模式

//饿汉模式   在类加载阶段就创建了实例   实例创建的时机非常早  非常急迫
class Singleton{// static 修饰的变量是类对象的成员变量   JVM加载时只加载一次private static Singleton instance = new Singleton();public static Singleton getSingleton() {return instance;}// 设置私有的构造方法  防止有人不通过getSingleton方法来获取到我们规定的单个示例   而是在别的类中new Singleton来创建实例private Singleton(){}
}

注:

  1. Singleton类的构造方法应该设置为私有的,防止别人不使用我们已经创建好的实例再创建新的实例。
  2. instance应该被private static修饰,构造方法被设置为私有的后,只有通过一个公共的static方法才能获取到实例
  3. 在类加载的时候就创建了实例,创建实例的时机非常紧迫,所以叫“饿汉模式”

懒汉模式

版本一:最简单的懒汉模式

//懒汉模式:在需要使用到实例的时候再创建实例,创建实例的时机不紧迫
class SingletonLazy{private static SingletonLazy instance = null;public static SingletonLazy getInstance(){if (instance == null){instance = new SingletonLazy();}return instance;}private SingletonLazy(){}
}

注:

  1. 在首次调用到getInstance的时候才会创建实例,后续再调用到getInstance的时候直接返回已经创建好的实例。
  2. 饿汉模式的效率更高。原因一:如果后续没人需要使用到实例,则创建实例的过程就被节省下来了;原因二:在类加载的过程中,JVM需要做的工作非常多。把创建实例的过程延后,可以给JVM减轻点负担。

版本二:考虑懒汉模式存在的线程安全问题

在饿汉模式中,调用到getInstance方法只涉及到读操作,不会有线程安全问题。
在懒汉模式中,调用到getInstance方法会进行判断后再创建实例,既涉及到读又涉及到修改。在多线程环境下就有可能创建多个实例,违背了单例模式

// 线程安全的懒汉模式
class SingletonLazy{private static SingletonLazy instance = null;public static SingletonLazy getInstance(){//加锁 保证线程安全 只能创建单个实例synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}return instance;}private SingletonLazy(){}
}

版本三:更完善的解决线程安全问题

像上面那样直接加锁,我们虽然可以保证线程是安全的。但是有一个新的问题:懒汉模式只有在第一次创建实例的时候才有线程安全问题,后续使用实例的时候直接返回实例就行,不需要加锁判断。但是像上面那样,在线程安全时也会加锁,降低了代码执行效率

// 懒汉模式更加完善的解决线程安全问题
class SingletonLazy{private static SingletonLazy instance = null;public static SingletonLazy getInstance(){//判断是否需要加锁if (instance == null) {synchronized (SingletonLazy.class) {// 判断是否已经创建实例//这个if不可少  当线程1 2 同时调用getInstance方法时  线程1执行完会创建实例// 如果没有if  线程2来了不知道是否已经有实例了 还会继续创建实例if (instance == null) {instance = new SingletonLazy();}}}return instance;}private SingletonLazy(){}
}

注:两个if都必不可少,各自有各自的作用:第一个if:在已经创建实例后,判断释放需要继续加锁;第二个if:在没有创建实例时,防止创建多个实例。

版本四:解决指令重排序问题

一个新的问题
new操作分为三步(粗略): 1.申请内存 2. 初始化实例 3. 将内存首地址赋值给instance
编译器可能进行指令重排序的优化 ,比如:
线程1 将1-2-3 的执行顺序 改为 1-3-2 并且在执行完1-3后 线程2调用getInstance 。线程2看到instance里已经有了地址就会直接返回 , 但是未初始化。在后续调用实例的属性/方法时会有问题!

class SingletonLazy{//加上volatile 禁止指令重排序private volatile static SingletonLazy instance = null;public static SingletonLazy getInstance(){if (instance == null) {synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}}return instance;}private SingletonLazy(){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx快速部署SSL证书_2023年10月29日可用

一、目的 Nginx快速部署SSL证书--2023年10月29日可用二、环境 Centos/Ubuntu服务器 前端代码文件夹: 假设为:/root/demo文件夹 域名 假设为:demo.com SSL证书(通过上一篇博客获取,获取其他方式获取到的SSL证书&…

modelsim仿真报错:vlog-2388 ‘scl‘ already declared in this scope

问题背景: 1、使用vivado直接仿真的时候没有报错。 2、在vivado中调用modelsim的时候报错。 报错的代码: module iic_write(input clk,input rst,output scl,input en,inout sda);reg scl;……报错的意思是scl已经声明过了,mode…

保姆级教学安装Linux操作系统,以及Linux的语法入门

🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专…

芯片设计中RTL级别总结

目录 一、简介二、详细介绍2.1 RTL级的基本要素和设计步骤2.2 书中推荐的设计步骤2.3 常用RTL级建模 三、其他相关链接芯片行业常用英文术语详细总结 一、简介 芯片设计级别简介 行为级(Behavior Level):通过行为级算法描述数字系统。 寄存器…

附录B 其他第三方软件移植(FTP、OpenSSH、GDB)

目录 开发板 FTP 服务器移植与搭建vsftpd 源码下载vsftpd 移植vsftpd 服务器测试配置vsftpd添加新用户Filezilla 连接测试 开发板 OpenSSH 移植与使用OpenSSH 简介OpenSSH 移植OpenSSH 源码获取移植zlib 库移植openssl 库移植openssh 库 openssh 设置openssh 使用ssh 登录scp 命…

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

简单而高效:使用PHP爬虫从网易音乐获取音频的方法

概述 网易音乐是一个流行的在线音乐平台,提供了海量的音乐资源和服务。如果你想从网易音乐下载音频文件,你可能会遇到一些困难,因为网易音乐对其音频资源进行了加密和防盗链的处理。本文将介绍一种使用PHP爬虫从网易音乐获取音频的方法&…

AI诈骗防范:技术检测工具的发展与应用

在当前信息时代,人工智能技术的飞速发展给我们带来了许多便捷,但也伴随着新的威胁,其中之一就是AI诈骗。不法分子越来越巧妙地使用AI生成虚假信息和声音,因此,我们迫切需要发展技术检测工具来应对这一挑战。 AI诈骗的…

【python笔记】小甲鱼

P3 查看内置函数 dir(__builtins__) P4 变量名命名规则: 1、变量名不能以数字打头; 2、变量名可以是中文 字符串可以是: 1、单引号:文本中存在双引号时使用单引号 2、双引号:文本中存在单引号时使用双引号 当…

raft和zab算法的区别

首先,二者都是通过选举一个 Leader 来简化复杂度,后续的工作都是由 Leader 来做。 投票的时候,二者都需要定义一个轮次 Raft 定义了 term 来表示选举轮次 ZooKeeper 定义了 electionEpoch 来表示 同步数据的时候,都希望选举出来…

【Kubernetes】Operator开发之kubebuilder实战(二)

1 解决(一)中的资源删除问题 在Operator开发之kubebuilder实战(一)的最后提到了Demo和Pod删除的问题: 由于DemoController只监听了Demo资源的变化,因此,删除Pod时,DemoController不…

Linux创建逻辑卷并扩容(超详细)

目录 ​编辑 一、概念解析 1、LV逻辑卷 2、PV物理卷 3、VG卷组 二、扩容前准备 三、创建逻辑卷并扩容 1、打开虚拟机 2、进入root用户 3、查看新加入的硬盘 4、创建主分区 5、创建物理卷 6、打包为一个卷组 7、创建逻辑卷 8、格式化逻辑卷 9、挂载逻辑卷--开机自…

Go学习第十四章——Gin请求与响应

Go web框架——Gin请求与响应 1 响应1.1 String1.2 JSON(*)1.3 HTML(*)1.4 XML1.5 文件(*) 2 请求2.1 请求参数查询参数 (Query)动态参数 (Param)表单参数 (PostForm)原始参数 (GetRawData) 2.2 请求头2.3 …

Ubuntu 22.04 在登录界面循环

问题描述 https://blog.csdn.net/weixin_44023406/article/details/134092271?spm1001.2014.3001.5502 接上一篇,磁盘满了,扩展空间之后能正常开机,进到登录界面,输密码3秒后又回到登录界面 分析解决问题 命令行能登录&#…

Vue 项目中使用 Pinia 状态管理详细教程

Pinia 是一个用于状态管理的现代 Vue 3 库,它提供了强大的工具来管理 Vue 应用程序的状态。以下是在 Vue 项目中使用 Pinia 的详细教程: 步骤 1:安装 Pinia 首先,你需要安装 Pinia。你可以使用 npm 或 yarn 安装它: …

【送书福利-第二十一期】《ChatGPT进阶:提示工程入门》

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文…

Java架构师系统安全

目录 1 导学2 信息安全基础知识3 信息安全系统的组成框架4 信息安全技术4.1 加密技术4.2 对称加密技术4.3 非对称加密技术4.4 信息摘要4.5数字签名5 信息安全的抗攻击技术5.1 ARP欺骗的原理5.2 ARP欺骗的防范措施5.3 IP欺骗的原理和流程6 信息安全的保证体系和评估方法7 网络安…

elementUI 特定分辨率(如1920*1080)下el-row未超出一行却换行

在1920*1080分辨率下, el-col 内容未超出 el-col 宽度,el-col 不足以占据一行,el-row 却自动换行了(其他分辨率没有这个问题)。 截图: 排查: el-col 内容没有溢出;没有多余的 pad…

TELUS Ventures(泰勒斯)

TELUS Ventures(泰勒斯)高峰论坛于2023年10月28日在南京第5站正式开幕。该论坛是由泰勒斯风险投资公司主办的一项重要活动,旨在促进创新和创业精神的发展 。 这次高峰论坛将汇集来自全球各地的创业者、投资者和行业专家,共同探讨…

Mac 版 WPS 接入 WPS AI,支持内容创作、修改文章、提炼重点等功能

导读近日消息,“WPS 办公助手”公众号发文宣布,Mac 版 WPS 现已接入 WPS AI,将带来内容生成、内容修改、辅助阅读等功能。 汇总 Mac 版 WPS 接入 WPS AI 之后,在文字、PDF 方面的功能如下: 一键生成文章大纲、讲话稿、…