创建型模式5.单例模式

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式可以用于管理全局的资源,确保整个系统中只有一个对象来处理特定任务。

单例模式的关键特性:

  1. 确保只有一个实例:单例模式确保在整个应用程序生命周期内,某个类只有一个实例。
  2. 提供全局访问点:通过公共静态方法,可以访问该唯一的实例。
  3. 延迟实例化:有时实例化时机会被延迟,只有在需要时才创建实例(懒汉式)。

1. 懒汉式(Lazy Initialization)

懒汉式单例模式在第一次使用时创建实例。它通常是线程不安全的,但可以通过同步来确保线程安全。

线程不安全的懒汉式:
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();  // 延迟实例化}return instance;}
}

问题:

  • 上述代码线程不安全。如果多个线程同时访问 getInstance() 方法,在没有同步的情况下,可能会创建多个实例。

线程安全的懒汉式: 

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public synchronized static Singleton getInstance() {if (instance == null) {instance = new Singleton();  // 延迟实例化}return instance;}
}

优点:

  • 只有在需要实例时才创建(延迟加载)。

缺点:

  • 使用 synchronized 来保证线程安全会影响性能,因为每次调用 getInstance() 都需要加锁。

2. 饿汉式(Eager Initialization)

饿汉式单例模式在类加载时立即创建实例。线程安全,且没有懒汉式的延迟加载问题,但不适用于需要在应用程序启动时创建对象的场景。

public class Singleton {// 静态实例在类加载时创建private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {return instance;}
}

优点:

  • 实例在类加载时创建,因此线程安全,不需要额外的同步操作。
  • 不会有性能问题。

缺点:

  • 如果类加载时没有使用单例对象,可能会浪费资源。

3. 双重检查锁定(Double-Checked Locking)

双重检查锁定是一种改进的懒汉式单例模式,使用 synchronized 来确保线程安全,但仅在实例为空时加锁,避免了每次调用 getInstance() 都加锁的性能损失。

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();  // 延迟实例化}}}return instance;}
}

优点:

  • 只有在实例为空时才进行加锁,减少了加锁的开销,提供了懒加载的优点,并且是线程安全的。

缺点:

  • 需要使用 volatile 关键字,确保内存可见性。

4. 静态内部类方式(推荐)

静态内部类方式是实现单例模式的最佳方法之一。它利用了类的加载机制,保证了线程安全和延迟加载。

public class Singleton {// 静态内部类,只有在调用 getInstance 时才会加载private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

优点:

  • 线程安全,且实现简单。
  • 延迟加载,只有在调用 getInstance() 时才实例化对象。
  • 通过类的加载机制实现线程安全,不需要显式加锁。
  • 具体的解析参考这个文章:静态内部类为什么在不需要加锁就是线程安全的单例模式-CSDN博客

总结:

  1. 懒汉式(线程不安全): 延迟实例化,适合需要延迟加载的场景,但需要处理线程安全问题。
  2. 饿汉式(线程安全): 类加载时实例化,线程安全,简单,但可能会造成资源浪费。
  3. 双重检查锁定: 提供了懒加载和线程安全的优势,性能较高。
  4. 静态内部类方式(推荐): 最佳的单例实现方式,延迟加载,线程安全,且简单。

对于大多数情况,静态内部类方式是最推荐的实现方式,因为它利用了Java的类加载机制,在保证线程安全的同时也保持了延迟加载的优点。

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

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

相关文章

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

nginx-链路追踪(trace)实现

一. 需求场景&#xff1a; 在日常运维工作中&#xff0c;会经常遇到在有多重调用链的场景下&#xff0c;如请求遇到非致命error时&#xff0c;在各环节的定位会非常麻烦&#xff0c;举个例子&#xff1a;比如说&#xff0c;在一个有多重调用链的服务环境下&#xff0c;一个请求…

c#使用SevenZipSharp实现压缩文件和目录

封装了一个类&#xff0c;方便使用SevenZipSharp&#xff0c;支持加入进度显示事件。 双重加密压缩工具范例&#xff1a; using SevenZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.…

MySQL和Hive中的行转列、列转行

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 MySQL1.行转列2.列转行 Hive1.行转列2.列转行(1)侧窗(2)union MySQL 1.行转列 把多行转成列。直接group&#xff0c;sum(if()) 2.列转行 Hive 1.行转列 select name,sum(if(kmshuxu…

快速上手:采用Let‘sEncrypt免费SSL证书配置网站Https (示例环境:Centos7.9+Nginx+Let‘sEncrypt)

1 关于Let’s Encrypt与Cerbot DNS验证 Let’s Encrypt 是一个提供 免费证书 的 认证机构。 Cerbot 是 Let’s Encrypt 提供的一个工具&#xff0c;用于自动化生成、验证和续订证书。 DNS验证是 Cerbot 支持的验证方式之一。相比 HTTP 验证或 TLS-ALPN 验证&#xff0c;DNS …

【Unity3D】Text文本文字掉落效果

相关技术&#xff1a;Text、TextMesh、Rigidbody&#xff08;刚体&#xff09;、BoxCollider&#xff08;碰撞体&#xff09;、TextGenerator、文本网格、文字网格 原理&#xff1a;使用UGUI Text获取其文字的每个字符网格坐标&#xff0c;转世界坐标生成对应的3D文本(TextMesh…

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年&#xff0c;这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合&#xff0c;大大提高了研发效率。在开发过程中&#xff0c;也遇到了一些性能相关问题和…

设计模式 行为型 命令模式(Command Pattern)与 常见技术框架应用 解析

命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求发送者和接收者解耦&#xff0c;通过将一个请求封装为一个对象&#xff0c;从而允许参数化客户端对象以进行不同的请求、排队请求或记录请求&#xff0c;并支持可撤销操作。 在软…

NodeLocal DNS 全攻略:从原理到应用实践

文章目录 一、NodeLocal DNS是什么&#xff1f;二、为什么使用NodeLocal DNS&#xff1f;三、工作原理架构图四、安装NodeLocal DNS五、在应用中使用NodeLocal DNSCache六、验证 一、NodeLocal DNS是什么&#xff1f; NodeLocal DNSCache 通过在集群节点上运行一个 DaemonSet …

jenkins入门12-- 权限管理

Jenkins的权限管理 由于jenkins默认的权限管理体系不支持用户组或角色的配置&#xff0c;因此需要安装第三发插件来支持角色的配置&#xff0c;我们使用Role-based Authorization Strategy 插件 只有项目读权限 只有某个项目执行权限

STM32-笔记34-4G遥控灯

4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…

STM32——系统滴答定时器(SysTick寄存器详解)

文章目录 1.SysTick简介2.工作原理3.SysTick寄存器4.代码延时逻辑5.附上整体代码6.一些重要解释 1.SysTick简介 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数…

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…

使用 Conda创建新的环境遇到的问题

下载速度很慢 1、更新 conda update -n base -c defaults conda2、清理缓存 conda clean --all解决方法 方法 1&#xff1a;关闭严格的渠道优先级 检查是否开启了严格渠道优先级&#xff1a; conda config --show channel_priority 如果返回 strict&#xff0c;说明启用了严…

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

nginx-灰度发布策略(基于cookie)

一. 简述&#xff1a; 基于 Cookie 的灰度发布是一种常见的策略&#xff0c;它允许您根据用户的特定 Cookie 值将流量路由到不同的服务版本。这种方法可以确保只有满足条件的用户会看到新版本的功能&#xff0c;从而降低风险并便于监控和回滚。 二. 配置案例&#xff1a; 测…

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务&#xff0c;解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么&#xff1f; 了解后台任务和长时任务前&#xff0c;我们需要先明白鸿蒙的后台特性&#xff1a;所谓的后台&#xff0c;指的是设备返回主界面、锁屏、…

怎么用vs编python文件

用vs编写python文件的方法&#xff1a;1、安装python插件&#xff0c;在vs的Extensions扩展中搜索Python&#xff0c;如下&#xff1a; 2、安装完成后&#xff0c;就需要配置一下本地python解释器的路径&#xff0c;这个直接在settings.json文件中设置参数python.pythonPath就可…