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

news/2024/11/26 20:18:43/

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/news/1550132.html

相关文章

CircuitBreaker机制详解:Elasticsearch中的资源管理

CircuitBreaker机制详解:Elasticsearch中的资源管理 在现代软件架构中,熔断器(CircuitBreaker)是一种重要的模式,用于防止系统过载并保护系统稳定性。在Elasticsearch中,熔断器机制尤其关键,因为它们帮助管理资源使用,防止节点因资源耗尽而崩溃。本文将深入探讨Elasti…

C51相关实验

C51相关实验 LED (P2 / 0~7)蜂鸣器 (P2^5)数码管 (P0 0~7 段 ,P2 2~4 位)独立按键 (P3^1 P3^0 P3^2 P3^3)直流电机 (J47 5v 01~04)综合实验矩阵按键 (P1组 0~7) LED (P2 / 0~7) //功能:1.让开发板的LED全亮,2,点亮某一…

嵌入式系统与单片机工作原理详解

随着现代科技的发展,嵌入式系统已经深入到我们日常生活中的方方面面。无论是智能家居、汽车电子,还是工业控制、医疗设备,都离不开嵌入式系统的支持。而单片机作为嵌入式系统的核心组件,是实现这些功能的关键之一。本文将详细介绍…

前端---HTML(一)

HTML_网络的三大基石和html普通文本标签 1.我们要访问网络,需不需要知道,网络上的东西在哪? 为什么我们写,www.baidu.com就能找到百度了呢? 我一拼ping www.baidu.com 就拼到了ip地址: [119.75.218.70]…

手机无法连接服务器1302什么意思?

你有没有遇到过手机无法连接服务器,屏幕上显示“1302”这样的错误代码?尤其是在急需使用手机进行工作或联系朋友时,突然出现的连接问题无疑会带来不少麻烦。那么,什么是1302错误,它又意味着什么呢? 1302错…

《Vue零基础入门教程》第五课:挂载

1) 基本语法 一个应用实例必须在调用了 .mount() 方法后才会渲染 传入参数: 可以是一个 CSS 选择器字符串(常用) 或者 一个实际的 DOM 元素返回值: 根组件实例 // 挂载应用, 返回根组件实例 const instance app.mount(#app) console.log(instance) 分析结果. 可知 instanc…

Android8设置拔出充电器自动关机

通常Android机器拔出充电后,将进入断开充电流程,关闭充电灯和充电图标。 那么需要实现拔出充电器直接进入关机,则需要在充电判断机制中额外增加实现代码。 || || 修改方案如下: 在系统中存在服务时刻监听的充电状态&#xff…

C#里怎么样使用正则表达式?

C#里怎么样使用正则表达式? 正则表达式是由普通字符(如英文字母)以及特殊字符(也称为元字符)组成的一种文字模式 这种文字模式可用于检查字符串的值是否满足一定的规则,例如: 验证输入的邮箱是否合法 输入的身份证号码是否合法 输入的用户名是否满足条件等 也可以…