设计模式-创建型-单例模式

server/2024/11/24 13:47:20/

1.概念

设计模式保证全局只有一个实例对象可以使用,并且自动实例化,向外部提供一个使用接口。

2.作用

保证某些对象在项目中只有一份。

3.应用场景

比如:
全局的计数器——web页面文章阅读计数
全局的资源共享——用户登录后各个页面之间共享用户信息
线程池、数据库连接池——线程和连接可以多个,池应该只有一个

4.特点

单例对象全局只有一份

5.类与对象关系

使用static修饰该单例对象,保证全局可访问

6.实现

单例模式有多种实现方式,根据其创建时机的不同,可以分为饿汉式与懒汉式

6.1饿汉式

饿汉式会在类加载时就完成对象的创建

java">public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {// 私有化构造函数}public static EagerSingleton getInstance() {return instance;}
}

6.2懒汉式

在真正要获取对象时才会创建对象,因为是调用方法时才创建对象,所以存在线程安全问题。

java">public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有化构造函数}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

6.3双重检查锁

为了保证懒汉式的线程安全,我们可以在方法上添加同步锁.

java">public class DoubleCheckedLockingSingleton {  private static volatile DoubleCheckedLockingSingleton instance;  private DoubleCheckedLockingSingleton() {  // 私有化构造函数  }  public synchronized static DoubleCheckedLockingSingleton getInstance() {  if (instance == null) {  instance = new DoubleCheckedLockingSingleton();  }  }  return instance;  }  
}

为了进一步缩小锁的粒度,提升效率,我们可以修改成以下形式,也叫双重检查锁

java">public class DoubleCheckedLockingSingleton {  private static volatile DoubleCheckedLockingSingleton instance;  private DoubleCheckedLockingSingleton() {  // 私有化构造函数  }  public static DoubleCheckedLockingSingleton getInstance() {  if (instance == null) {  synchronized (DoubleCheckedLockingSingleton.class) {  if (instance == null) {  instance = new DoubleCheckedLockingSingleton();  }  }  }  return instance;  }  
}

http://www.ppmy.cn/server/144556.html

相关文章

数据结构——小小二叉树第三幕(链式结构的小拓展,二叉树的创建,深入理解二叉树的遍历)超详细!!!

文章目录 前言一、二叉树的层序遍历二、二叉树的有关习题2.1 单值二叉树题目思路代码 2.2 相同的树题目思路代码 2.3 对称的树题目思路代码 2.4 二叉树的遍历题目思路代码 2.5 二叉树的遍历题目思路代码 2.6 二叉树的有关选择题 总结 前言 上篇博客我们学习了链式结构的二叉树&…

开发中常见邮箱服务器以及端口号

邮箱类型服务器端口备注QQ邮箱smtpsmtp.qq.com587https://mail.qq.com/imapimap.qq.com993pop3pop.qq.com995163邮箱smtpsmtp.163.com25https://mail.163.com/imapimap.163.com993pop3pop.163.com995126邮箱smtpsmtp.126.com25https://mail.126.com/imapimap.126.com993pop3pop…

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作(一)安装 Node.js 和 Git(二)注册 GitHub 账号 三、安装 Hexo(一)创建博客目录(二)安装 H…

【BUG】ES使用过程中问题解决汇总

安装elasticsearch内存不足问题 问题回顾 运行kibana服务的时候,无法本地访问 解决 首先排查端口问题,然后检查错误日志 无法运行kibana服务,是因为elasticsearch没有启动的原因 发现致命错误,确定是elasticsearch服务没有运行导…

部署端侧大模型

端侧大模型是当前人工智能领域的热点话题。 一.端侧大模型发展现状 1.论文: 《On-Device Language Models: A Comprehensive Review》 链接:https://arxiv.org/abs/2409.00088 简介: 该论文全面综述了设备端语言模型的发展,包…

elasticsearch7.10.2集群部署带认证

安装elasticsearch rpm包安装 下载地址 https://mirrors.aliyun.com/elasticstack/7.x/yum/7.10.2/ 生成证书 #1.生成CA证书 # 生成CA证书,执行命令后,系统还会提示你输入密码,可以直接留空 cd /usr/share/elasticsearch/bin ./elasticsearch-certutil ca#会在/usr/share/el…

D 型 GaN HEMT 在功率转换方面的优势

氮化镓 (GaN) 是一种 III-V 族宽带隙半导体,由于在用作横向高电子迁移率晶体管 (HEMT) 时具有卓越的材料和器件性能,因此在功率转换应用中得到越来越多的采用。 HEMT 中产生的高击穿电场 (3.3 MV/cm) 和高二维电子气 (2DEG) 载流子迁移率 (2,000 cm 2 /…

clipboard

clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…