java设计模式(一)——单例模式

一、模式介绍

单例模式:
某一个类在系统中只需要有一个实例对象,而且对象由这个类自行实例化并提供给系统其他地方使用,这个类称为单例类。

使用场景:
1、处理资源访问的冲突
2、从业务概念上有些数据在系统中只应保存一份

特点:
某个类只能有一个实例,即使是在多线程运行环境下;
单例类的实例一定是单例类自身创建,而不是单例类外部用其他方式如new方式创建
单例类只需要提供一个方法想整个系统提供这个实例对象

分类:
单例模式分为饿汉模式和懒汉模式,
懒汉模式的意思就是这个类很懒,只要别人不找它要实例,它都懒得创建。
饿汉模式在初始化时,我们就创建了唯一的实例,即便这个实例后面并不会被使用。

二、代码实现

1、饿汉模式实现

/*** 饿汉模式* 使用静态常量在类加载前创建实例,其线程是安全的,有jvm保证其线程安全*/
public class HungrySingleton {private static final HungrySingleton instance = new HungrySingleton();//构造函数定义为私有,防止外部创建实例private HungrySingleton(){}// 系统使用单例的入口public static HungrySingleton getInstance(){return instance;}
}

2、懒汉模式实现

2.1、经典懒汉模式
/*** 经典单例模式,只适用于单线程,线程不安全*/
// 懒汉模式
public class LayzSingleton01 {private static LayzSingleton01 instance;//构造函数定义为私有,防止外部创建实例private LayzSingleton01(){}//系统使用单例的入口public static LayzSingleton01 getInstance(){if(instance==null){return new LayzSingleton01();}return instance;}
}
2.2、线程安全懒汉模式
/*** 懒汉模式,* 添加 synchronized 保证线程安全,单会拖延效率* 高并发下多个线程区获取这个实例,需要排队。*/
// 懒汉模式
public class LayzSingleton02 {private static LayzSingleton02 instance;//构造函数定义为私有,防止外部创建实例private LayzSingleton02(){}//系统使用单例的入口public static synchronized LayzSingleton02 getInstance(){if(instance == null){return new LayzSingleton02();}return instance;}}
2.3、优化效率懒汉模式
/*** 懒汉模式,添加synchronized代码块解决效率问题,但是此情况还是会出现线程不安全情况* 假设我们有两个线程 T1与T2并发访问getInstance方法。* 当T1执行完if (instance == null)且instance为null时,其CUP执行时间被T2抢占,所以T1还没有创建实例。* T2也执行if (instance == null),此时instance肯定还为null,T2执行创建实例的代码,* 当T1再次获得CPU执行时间后,其从synchronized 处恢复,又会创建一个实例。*/// 懒汉模式
public class LayzSingleton03 {private static LayzSingleton03 instance;//构造函数定义为私有,防止外部创建实例private LayzSingleton03(){}//系统使用单例的入口public static LayzSingleton03 getInstance(){if(instance==null){synchronized (LayzSingleton03.class){instance = new LayzSingleton03();}}return instance;}
}
2.4、double-check懒汉模式
/*** 懒汉模式,double-check 保证线程安全和效率* 这种单例的写法做了两次 if (null == instance)的判断,因此被称为double-check的方式。* 第一次check为了提高访问性能。因为一旦实例被创建,后面线程的所有的check都为假,不需要执行synchronized竞争锁了。* 第二次check是为了线程安全,确保多线程环境下只生成一个实例。* 需要注意的是,这种方式,在定义实例时一定需要加上volatile 关键字,禁止虚拟机指令重排,* 否则,还是有一定几率会生成多个实例,关于volatile 关键字和指令重排的问题请自行百度,*/// 懒汉模式
public class LayzSingleton04 {//注意加上volatile关键字private static volatile LayzSingleton04 instance;//构造函数定义为私有,防止外部创建实例private LayzSingleton04(){}//系统使用单例的入口public static LayzSingleton04 getInstance(){//第一次检查提高访问性能if(instance==null){synchronized (LayzSingleton04.class){//第二次检查为了线程安全if(instance==null){instance = new LayzSingleton04();}}}return instance;}
}

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

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

相关文章

港湾周评|胖东来为什么是胖东来?蜜雪冰城为什么差之千里?

《港湾商业观察》李镭 似乎每一次胖东来的热搜,都堪称为教科书般化不利为有利,变坏事为好事。 6月27日凌晨,“胖东来商贸集团”官方公众号发布《关于新乡胖东来餐饮商户“擀面皮加工场所卫生环境差”的调查报告》,对于帮助其发现…

【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

git 代码回退 soft hard区别

一:只是本地修改提交到本地版本库仓库,代码如何回退 git hard 回退 会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到没有修改前的状态 git soft 回退 不会清除掉 你当前修改的所有文件代码内容 或添加的新文件 把当前文件恢复到当时修改时的状…

Scrapy实现关键词搜索的数据爬取

爬虫技术对于从互联网上获取数据和信息非常重要,而scrapy作为一款高效、灵活和可扩展的网络爬虫框架,能够简化数据爬取的过程,对于从互联网上爬取数据的工作非常实用。本文将介绍如何使用scrapy实现关键词搜索的数据爬取。 Scrapy的介绍 Sc…

oca和 ocp有什么区别

OCA(Oracle Certified Associate)和OCP(Oracle Certified Professional)在Oracle的认证体系中是两种不同级别的认证,它们之间存在明显的区别。以下是对两者区别的详细解释: 认证级别: OCA&…

Linux /proc目录总结

1、概念 在Linux系统中,/proc目录是一个特殊的文件系统,通常被称为"proc文件系统"或"procfs"。这个文件系统以文件系统的方式为内核与进程之间的通信提供了一个接口。/proc目录中的文件大多数都提供了关于系统状态的信息&#xff0…

字体大小为0的巧妙应用:CSS中的font-size: 0px

在CSS的世界里,font-size: 0px是一个看似简单的属性,却有着不为人知而强大的功能。本文将通过一个具体的示例,探讨它在布局中的妙用。 问题背景 在网页设计中,我们经常需要将文本和图片水平对齐。但是,由于图片和文本…

AGX-ORIN I210网卡烧录mac地址

1、介绍 I210的固件,是烧录在外部的FLash中,且固件的前12个自己是MAC地址 所在的位置 因此 需要下载eeprom工具 ,已修改MAC地址 。 2、编译 使用企业账号登陆Intel官网,下载572162-eepromaccesstool-0.8.0.zip 解压 unzip 572162-eepromaccesstool-0.8.0.zipcd eeprom…

axios发送请求,后端无法获取cookie

1.前端 axios默认不携带cookie 添加如下代码 import axios from "axios" const requrst axios.create({baseURL: import.meta.env.VITE_APP_URL,timeout: 5000,}) //让axios携带cookie requrst.defaults.withCredentials true 2.后端nestjs main.ts app.enabl…

Linux容器篇-Docker容器的使用

文章目录 前言一、Docker的安装主机环境准备关闭防火墙关闭selinux时间同步关闭 swap配置操作系统yum源配置国内Docker-ce镜像源注意 二、安装docker-ce三、配置镜像加速器阿里云镜像加速器生成 四、Docker的使用Docker 客户端获取镜像启动容器查看所有的容器:启动已…

【Python】已解决:ModuleNotFoundError: No module named ‘LAC‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘LAC‘ 一、分析问题背景 在开发或运行Python程序时,可能会遇到各种各样的报错,其中“ModuleNo…

安装OpenHarmony编译库和工具集

一、搭建开发环境 1.1、Ubuntu搭建,参考 VMware完美安装Ubuntu20.04-CSDN博客文章浏览阅读286次,点赞5次,收藏3次。详细介绍了VMware下安装Ubuntu20.04https://blog.csdn.net/longyuzi/article/details/139935769 1.2、拉取OpenHarmony源码…

Android studio Logcat 功能介绍

介绍 Android Studio Jellyfish版本下logcat功能,不同的tag会有不同的颜色,不同level等级的log默认也有不同的颜色。log过滤修改的更简洁了,原先的log视图只需要勾选就可以选择不同level的log了,当前需要在输入框中进行过滤器匹配…

Ansible自动化部署

AUTHOR:闫小雨TIME:2024-06-26 文章目录 一、Ansible简述1、使用者的四种交互方式2、Ansible工具集3、作用对象 二、Ansible安装1、使用yum安装,并安装EPEL仓库2、使用pip源代码安装3、使用pip直接安装 4、 创建ssh免交互登录 三、Ansible配置…

正版软件 | R-Studio Corporate:企业级数据恢复的终极解决方案

数据是企业的生命线,而数据丢失可能随时威胁到企业的正常运营。R-Studio Corporate 是一款专为企业环境设计的多功能数据恢复软件,确保您在面临数据危机时,能够迅速、高效地恢复宝贵数据。 跨平台操作,灵活恢复 R-Studio Corporat…

从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计(AI与学术的交响:ChatGPT辅助下的实验设计新篇章)。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…

【一生一芯】笔记

文章目录 一级目录二级目录三级目录缓存的验证 一级目录 二级目录 三级目录 缓存的验证

阿里云 CosyVoice 语音合成大模型 API 实践

前言 最近大模型这么火,就想着玩一下,作为非 AI 从业者,最好的方式就是调用云服务的 API 来构建自己的 AI 应用。首选当然是国外的 ChatGPT API,但是说实话那个玩意有点贵,而且最近国内也被封禁不让调用了&#xff0c…

计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计

酒店推荐系统开题报告 一、研究背景与意义 随着旅游业的蓬勃发展和人们生活水平的提高,酒店行业迎来了前所未有的发展机遇。然而,面对众多的酒店选择,消费者往往难以在短时间内找到最适合自己需求和预算的酒店。因此,开发一款高…

晋级国赛!卓翼飞思技术引领,助力辽宁赛区机器人及人工智能大赛圆满收官

近日,第二十六届中国机器人及人工智能大赛—辽宁赛区选拔赛在大连海事大学圆满收官。本次大赛吸引来自辽宁工业大学、大连理工大学等知名高校的10余支队伍参与,充分展现各高校在机器人及人工智能领域的深厚实力和创新精神。其中,由卓翼飞思实…