【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

单例设计模式

  • Java单例设计模式


Java单例设计模式

  • 单例设计模式(Singleton):单例即唯一实例,某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。(例如:代表JVM运行环境的Runtime类)

要点

  • ①某个类只能有一个实例。
    • 构造器私有化。
  • ②这个类必须自行创建这个实例。
    • 含有一个该类的静态变量来保存这个唯一的实例。
  • ③这个类必须自行向整个系统提供这个实例。
    • 对外提供获取该实例的方式:
        1. 直接暴露
        2. 用静态变量的get方法获取

饿汉式

  • 饿汉式:直接创建对象,不存在线程安全问题。(在类初始化时直接创建对象,不管你是否需要这个对象都会创建)
  • 实现方式:
    • 直接实例化饿汉式(简洁明了)
    • 枚举式(最简洁)
    • 静态代码块饿汉式(适合复杂实例化)

  1. 直接实例化
//Singleton:单例设计模式,软件开发中常见的设计模式之一//单例设计模式——饿汉式1:直接实例化饿汉式
/** 1.构造器私有化* 2.自行创建,并且用静态变量保存* 3.向外提供这个实例* 4.使用final修饰,强调这是一个单例*/
public class Singleton_hungry1 {//直接实例化private static final Singleton_hungry1 INSTANCE = new Singleton_hungry1();//构造器私有化private Singleton_hungry1(){}}

  1. 枚举式
/*** 枚举类型:表示该类型的变量是有限的几个* 我们可以限定为一个,从而成了单例**/
public enum Singleton_hungry2 {//枚举类型的实例INSTANCE;private Singleton_hungry2() {}
}

  1. 静态代码块
public class Singleton_hungry3 {public static final Singleton_hungry3 INSTANCE;static {//复杂情况在静态代码块中解决INSTANCE = new Singleton_hungry3();}private Singleton_hungry3() {}
}

懒汉式

  • 懒汉式:延迟创建对象。
  • 实现方式:
  • 线程不安全(适用于单线程)
  • 线程安全(适用于多线程)
  • 静态内部类形式(适用于多线程)
  1. 线程不安全
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton4 {private static Singleton4 instance;private Singleton4() {}//线程不安全public static Singleton4 getInstance() {if(instance == null) {instance = new Singleton4();}return instance;}}

  1. 线程安全
public class Singleton5 {private static Singleton5 instance;private Singleton5() {}public static Singleton5 getInstance() {//上锁、线程安全synchronized(Singleton5.class){if(instance == null) {instance = new Singleton5();}}return instance;}}

  1. 静态内部类形式
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton6 {private Singleton6() {}//内部类:静态内部类不会随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的//唯一实例因为是在内部类加载和初始化时才创建的,所以线程安全private static class inner{//唯一实例: 在内部类被加载和初始化时才被创建private static Singleton6 instance = new Singleton6();}public static Singleton6 getInstance() {return inner.instance;}}



在这里插入图片描述

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

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

相关文章

031-从零搭建微服务-监控中心(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

KMS在腾讯云的微服务实践助力其降本50%

背景介绍 KMS 是一家日本的游戏公司,主要经营游戏业务、数字漫画业务、广告业务、云解决方案业务等,出品了多款在日本畅销的漫画风游戏,同时有网络漫画专业厂牌,以内容创作为目标,拥有原创 IP 创作、游戏开发等多元化发…

第三篇:实践篇 《使用Assembler 实现图片任意切割功能》

实现原理: 共用一个texture、material、渲染状态等。紧通过修改vertex、uvs、indexes数据即可实现任意切割功能。 一、线段分割多边形,并分散多边形 线段分割多边形 已知多边形points,线段sp、ep。线段分割多边形得到两个多边形。 publi…

竞赛选题 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…

oracle,CLOB转XML内存不足,ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE“,

通过kettle采集数据时,表输入的组件,查询报错。 ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE”, line 272 ORA-06512: at line 1 通过 ALTER SESSION SET EVENTS ‘31156 trace name context forever, level 0x400’; 修改会话配置 或直接修改…

网络协议--广播和多播

12.1 引言 在第1章中我们提到有三种IP地址:单播地址、广播地址和多播地址。本章将更详细地介绍广播和多播。 广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主…

安卓开发实例:方向传感器

调用手机的方向传感器&#xff0c;X轴&#xff0c;Y轴&#xff0c;Z轴的数值 activity_sensor.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android"http://schemas.android.c…

结构伪类选择器

伪类选择器&#xff1a;用来描述一个元素的特殊状态&#xff01;比如第一个元素、某个元素的子元素、鼠标点击的元素 1 first-child/last-child /*ul的第一个子元素*/ ul li:first-child{ background: #0f35ad; } /*ul的最后一个子元素*/ ul li:last-child{ background: #0f3…

ExcelPatternTool 开箱即用的Excel工具包现已发布!

文章目录 ExcelPatternTool功能特点&#xff1a;快速开始使用说明常规类型高级类型Importable注解Exportable注解IImportOption导入选项IExportOption导出选项单元格样式StyleMapping样式映射使用数据库作为数据源 示例Sample1&#xff1a;不同类型字段导出Sample2&#xff1a;…

ChatGLM系列七:LangChain+ChatGLM-6B

背景介绍 在开发过程中&#xff0c;我们经常会遇到需要构建基于本地知识库的问答系统的问题。这种系统需要能够根据用户提供的问题&#xff0c;在本地的知识库中查找并返回相关答案。然而&#xff0c;要实现这样的功能并不容易&#xff0c;涉及到语言模型的选择、知识库的管理…

Vsan数据恢复—Vsan存储断电导致虚拟机无法启动的数据恢复案例

Vsan分布式存储故障&检测&#xff1a; 异常断电导致一台vsan存储设备上层虚拟机无法启动。 将故障Vsan存储上的所有磁盘编号后取出&#xff0c;由北亚企安的硬件工程师对vsan存储上的所有硬盘进行物理故障检测&#xff0c;经过检测没有发现硬盘存在物理故障。 vsan存储结构…

问界新M7也扛起“遥遥领先”大旗,华为究竟做对了什么?

循着时间脉络&#xff0c;华为似乎正在实现全方面的“遥遥领先”。 继Mate 60系列手机产品的强势回归之后&#xff0c;华为参与的汽车项目也登上了“热搜榜”。近段时间&#xff0c;问界新M7正处于“卖爆”状态。 据了解&#xff0c;2023年9月12日&#xff0c;华为发布了问界…

公网IP怎么设置?公网ip有哪些优点和缺点?

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全和隐私保护。其中&#xff0c;公网IP的设置成为了一个备受关注的话题。本文将详细介绍公网IP的设置方法以及公网IP的优点和缺点。 一、公网IP设置方法 1. 路由器设置 在家庭或企业网络中&#xff0c;路由器通常是最重…

【Linux】开发工具

目录 Linux编译器-gcc/g使用执行命令&#xff1a;我们的.o和库是如何链接的? make/Makefile依赖关系、依赖方法 Linux编译器-gcc/g使用 gcc只能编译c语言&#xff0c;g可以编译c语言也可以编译g 背景知识&#xff1a; 预处理&#xff08;进行宏替换)编译&#xff08;生成汇编)…

荣耀推送服务消息分类标准

前言 为了提升终端用户的推送体验、营造良好可持续的通知生态&#xff0c;荣耀推送服务将对推送消息进行分类管理。 消息分类 定义 荣耀推送服务将根据应用类型、消息内容和消息发送场景&#xff0c;将推送消息分成服务通讯和资讯营销两大类别。 服务通讯类&#xff0c;包…

JS清除字符串中的空格

一、replace()方法 replace方法在字符串中搜索值或正则表达式&#xff0c;返回已替换值的新字符串&#xff0c;不会更改原始字符串。 去除字符串内所有的空格&#xff1a;str str.replace(/\s*/g,“”) 去除字符串内两头的空格&#xff1a;str str.replace(/^\s*|\s*$/g,“…

Mac怎么清理磁盘空间?释放Mac磁盘空间有效方法

相信很多使用macOS系统的小伙伴都收到过提示“磁盘空间已满”消息&#xff0c;尤其是采用SSD固态硬盘的MacBook系列&#xff0c;120G的硬盘空间本就捉襟见肘&#xff0c;使用一段时间后&#xff0c;即使自己没有存放很多大文件&#xff0c; Mac的磁盘很快就满了。那么&#xff…

使用python实现http协议的方法

要使用Python编写一个接口&#xff0c;其入参格式为x-www-form-urlencoded&#xff0c;你可以使用requests库。requests库是一个流行的HTTP库&#xff0c;它使得发送HTTP请求变得非常简单。 下面是一个简单的示例&#xff0c;展示如何使用requests库发送一个POST请求&#xff…

【面试经典150 | 链表】两数相加

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…

升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败

升级 IDE Xcode 15 后本地模拟器 Simulator 全被清空,反复重新尝试 Get 下载频频因网络异常断开而导致失败 ... 注:通过 Get 方式下载一定要保证当前网络环境足够平稳,网络环境不好的情况下该方法几乎成不了 解决办法 Get 方式行不通可以尝试通过 官网 途径先下载 模拟器安装包…