Java设计模式【单例模式】

news/发布时间2024/5/15 17:44:07

一、前言

单例模式:创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

特点

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例

二、单例模式

分类:饿汉式、懒汉式、双重检查锁、静态内部类、枚举 。

使用场景:确保全局只有一个实例的场景

  • 线程池:在多线程环境下,线程池需要保证只有一个实例
  • 数据库连接池:数据库连接池也需要保证只有一个实例
  • 日志对象:日志对象通常是全局可见的,因此需要保证只有一个实例
  • 配置文件:在某些情况下,需要全局共享的配置文件也需要保证只有一个实例

2.1 饿汉式【推荐】

特点

  • 线程安全
  • 执行效率高
  • 非懒加载
  • 类加载时就初始化,浪费内存
  • 容易产生垃圾对象

2.1.1 静态变量

/*** 饿汉式-静态变量*/
public class Singleton {private final static Singleton INSTANCE = new Singleton();// 私有构造函数private Singleton() {}// 公有访问方法public static Singleton getInstance() {return INSTANCE;}
}

2.1.2 静态代码块

/*** 饿汉式-静态代码块*/
public class Singleton {private final static Singleton INSTANCE;static {INSTANCE = new Singleton();}// 私有构造函数private Singleton() {}// 公有访问方法public static Singleton getInstance() {return INSTANCE;}
}

2.2 饿汉式

2.2.1 非线程安全

特点

  • 懒加载
  • 线程不安全
  • 未加锁,执行效率较高
/*** 懒汉式-非线程安全*/
public class Singleton {private static Singleton INSTANCE;// 私有构造函数private Singleton() {}// 公有访问方法public static Singleton getInstance() {if (INSTANCE == null) {INSTANCE = new Singleton();}return INSTANCE;}
}

2.2.2 线程安全

特点

  • 懒加载
  • 线程安全
  • 方法加锁,执行效率低
  • 存在隐患(多线程环境中可能会使用到未创建完毕的对象)
/*** 懒汉式-线程安全*/
public class Singleton {private static Singleton INSTANCE;  // 私有构造函数private Singleton (){}  // 公有访问方法public static synchronized Singleton getInstance() {  if (INSTANCE == null) {  INSTANCE = new Singleton();  }  return INSTANCE;  }  
}

2.3 双重检查锁【推荐】

特点

  • 懒加载
  • 线程安全
  • 检查后加锁,执行效率较高
/*** 双重检查锁懒汉式*/
public class Singleton {/*** volatile作用禁止指令重排序* 注意:对象的创建其实不是一步到位的,它是分三步进行* ①、在堆中给对象分配内存空间* ②、初始化赋值* ③、建立关联(将引用指向分配的内存空间)*/private volatile static Singleton INSTANCE;  // 私有构造函数private Singleton() {}  // 公有访问方法public static Singleton getSingleton() {  if (INSTANCE == null) {  synchronized (Singleton.class) {  if (INSTANCE == null) {  INSTANCE = new Singleton();  }  }  }  return INSTANCE;  }  
}

2.4 静态内部类【推荐】

特点

  • 懒加载
  • 线程安全
  • 执行效率高
/*** 静态内部类*/
public class Singleton {private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton();  }// 私有构造函数private Singleton() {}// 公有访问方法public static Singleton getInstance() {  // 调用getInstance方法时才加载实例化return SingletonHolder.INSTANCE;  }  
}

2.5 枚举【推荐】

特点

  • 线程安全
  • 执行效率高
/*** 枚举*/
public enum Singleton {INSTANCE;// 方法
}

三、使用单例

public class SingletonDemo {public static void main(String[] args) {// 编译时错误:构造函数Singleton()是不可见的//Singleton object = new Singleton();Singleton singleton = Singleton.getInstance();singleton.xxmethod();}
}

四、总结

  • 一般场景建议使用饿汉式
  • 明确要实现lazy loading效果时使用匿名内部类
  • 需要反序列化创建单例类对象时使用枚举(重写readResolve方法返回单例)
  • 特殊需求使用双重检查锁

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

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

相关文章

gitlab的使用

前一篇文章我们已经知道Git人人都是中心,那他们怎么交互数据呢? • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…

Sui基金会与沙迦美国大学宣布合作开设区块链学院

沙迦美国大学(American University of Sharjah,AUS)作为中东领先的创新中心,与Sui合作推出了一个新的区块链研究中心,进一步提升了其在创新领域的声誉。 该举措是沙迦酋长国旨在将自己定位为教育和研究区域中心的一部…

linux增加物理磁盘并挂载到文件系统

centos7增加物理磁盘并挂载到文件系统 1、查看所有磁盘情况 fdisk -l2、创建挂载路径 mkdir /data3、格式化磁盘 #磁盘filesystem(上图标红处) mkfs.xfs -f /dev/sda建议 与其它磁盘文件系统保持一致,我这里是xfs 可通过 cat /dev/sda查看 4、挂载 mount /dev/…

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者: 来自 Elastic David Hope ChatGPT 现在非常火爆,甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员,我对这项技术的可能性感到非常兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将会呈指数级…

Android约束布局中用ConstraintHelper实现过渡动画效果

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 一.创建一个类CircularRevealHelper继承ConstraintHelper代码如下 /*** Author: ly* Da…

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

群晖NAS DSM7.2.1安装宝塔之后无法登陆账号密码问题解决

宝塔的安装就不在这赘述了,只说下,启动之后默认账号密码无法登陆的问题。 按照上面给出的账号密码,无法登陆 然后点忘记密码,由于是docker安装的,根目录下没有/www/server/panel 。 也没有bt命令 要怎么修改呢。 既然…

微信小程序uniapp劳务咨询系统知识百科考试系统java+python+nodejs+php均支持

使用劳务咨询服务平台小程序的分别管理员和用户二个权限子模块。 管理员所能使用的功能主要有:首页、个人中心、用户管理、百科分类管理、知识百科管理、地区信息管理、劳务需求管理、试卷管理、试题管理、论坛交流、系统管理、考试管理等。 用户用户端可以实现首页…

爬虫知识--03

数据存mysql import requests from bs4 import BeautifulSoup import pymysql# 链接数据库pymysql conn pymysql.connect(userroot,password"JIAJIA",host127.0.0.1,databasecnblogs,port3306, ) cursor conn.cursor() cursor conn.cursor()# 爬数据 res request…

Clickhouse的安装

1.准备工作 确定防火墙处于关闭状态 ulimit -a 2.CentOS取消打开文件数限制 (1)在 hadoop102 的 /etc/security/limits.conf 文件的末尾加入以下内容 sudo vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 * soft nproc …

ChatGPT在数据分析OKR计划中的应用

ChatGPT在数据分析OKR计划中的应用 ​ 现在大多数公司引入了OKR(objective & key result)计划,数据分析师也需要定期制定和检查自己的OKR计划。我们不仅可以利用ChatGPT辅助制定OKR计划,也可以让其对OKR计划内容进行调整、优…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

LeetCode二叉搜索树最近节点查询

问题描述 给你一个 二叉搜索树 的根节点 root ,和一个由正整数组成、长度为 n 的数组 queries 。 请你找出一个长度为 n 的 二维 答案数组 answer ,其中 answer[i] [mini, maxi] : mini 是树中小于等于 queries[i] 的 最大值 。如果不存在…

小程序--应用生命周期

小程序的应用周期处理逻辑都写在app.js中。 一、onLaunch 小程序启动时(初始化完成)执行,只执行一次。 常用于小程序更新,获取启动参数,获取场景值。 二、onShow 小程序启动,或从后台切换至前台时执行。 …

每天一个知识点 - 如何快速熟悉后端项目

入职一家新公司的时候,不可避免的就是接触到新公司的项目,有些项目一启动就是好几年,业务功能极其复杂,下面我总结几个方法让大家快速熟悉后端项目(图文结合) 用例图简析 用例是系统中的一个功能单元&…

煤炭开采和洗选厂5G数字孪生可视化平台,推进煤炭洗选行业数字化转型

煤炭开采和洗选厂5G数字孪生可视化平台,推进煤炭洗选行业数字化转型。在煤炭行业中,数字孪生技术的应用正在逐渐普及,为煤炭开采和洗选厂的数字化转型提供了强有力的支持。数字孪生可视化平台作为数字孪生技术的重要组成部分,能够…

消息中间件篇之RabbitMQ-延时队列

一、延时队列 延迟队列:进入队列的消息会被延迟消费的队列。 场景:超时订单、限时优惠、定时发布。 延迟队列死信交换机TTL(生存时间)。 二、死信交换机 当一个队列中的消息满足下列情况之一时,可以成为死信&#xf…

kafka为什么性能这么高?

Kafka系统架构 Kafka是一个分布式流处理平台,具有高性能和可伸缩性的特点。它使用了一些关键的设计原则和技术,以实现其高性能。 上图是Kafka的架构图,Producer生产消息,以Partition的维度,按照一定的路由策略&#x…

抖音视频下载工具|视频内容提取软件

引言部分: 针对抖音视频下载需求,我们团队自豪推出一款功能强大的工具,旨在解决用户获取抖音视频繁琐问题的困扰。我们通过基于C#开发的工具,让用户能够轻松通过关键词搜索实现自动批量抓取视频,并根据需求进行选择性批…

flink cdc原理与使用

flink cdc原理与使用 1 cdc 介绍1.1 cdc简介与对比1.2 基于日志的 CDC 方案介绍 2 基于 Flink SQL CDC 的数据同步方案实践2.1 案例 1 : Flink SQL CDC JDBC Connector2.2 案例 2 : CDC Streaming ETL2.3 案例 3 : Streaming Changes to Kafka 3 Flink SQL CDC 的更多应用场景…
推荐文章