设计模式之《单例模式》的多种实现--Java

深入理解java设计模式之单例模式 单例模式确保一个类在应用程序中只有一个对象实例存在,并提供一种全局访问该实例的方式。 阅读详情

Java单例模式如何实现

 

单例模式属于创建型设计模式,该类设计模式抽象了对象创建、组织的过程,将目标类的信息进行封装,仅向外部提供获取对象的接口。

单例模式确保系统中只包含一个目标类的实例,负责完成其实例化并向外部提供该实例。一般可用于文件创建、数据库连接等辅助类,实现对系统资源的控制。

一般来说,单例模式在实现上具有私有构造方法、私有静态变量、公有返回接口等特点。以下为几种常见的单例模式实现方法。

1.饿汉模式

饿汉模式在类加载时完成实例的创建,不存在线程安全的问题,缺点在于即使未被引用也始终会存在该类的实例。

class Singleton{
    private static final Singleton singleton = new Singleton();
​
    private Singleton(){}
​
    public static Singleton getInstance(){
        return singleton;
    }
}
  • 注意final,保证引用的实例不变。

2.懒汉模式

懒汉模式在初次获取实例时完成创建并返回,可以实现懒加载,但其缺点在于初次获取时可能需要更长的时间;适用于创建消耗大、实例使用少的情况,存在线程安全问题。

class Singleton{
    private static Singleton1 instance = null;
​
    private Singleton() { }
​
    public static Singleton getInstance() {
        if (null == instance) {
            instance = new Singleton();
        }
        return instance;
    }
}

3.双重检验锁

双重检验锁是适用于多线程模式下的懒汉模式,相比于直接对整个getInstance()方法加锁,可以减少大量进入临界区的性能消耗。

class Singleton{
    private static volatile Singleton singleton;
​
    private Singleton(){}
​
    public static Singleton getInstance(){
        if (singleton == null){
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
  • 第一层判断是为了在实例已经初始化时直接返回,第二层锁可以防止同时进入临界区的不同线程多次实例化对象。

  • 注意volatile:

    • 由于singleton = new Singleton();并非原子操作,而是由分配内存空间、初始化对象以及将引用指向堆对象三个步骤完成,而在JVM执行时可能产生重排序,使得引用变量指向了未初始化的堆对象,导致另一个线程判断失败(第一层)获取到该未初始化的实例;如下图所示:

    • volatile关键字可以保证线程之间的可见性及有序性,使所有写操作先于读操作执行,避免上述问题。

4.利用静态内部类

  1. 线程安全:与懒汉模式相同,利用类的加载保证单例对象只被实例化一次;

  2. 懒加载:由于一个类只有在其静态成员初次被引用时才会被加载,即调用Singleton.getInstance()时内部类SingletonHolder才会被加载,同时初始化instance。

  3. 反射安全:通过反射不能从外部类中获取内部类的属性,即不可对instance进行修改。

public class Singleton{
    private static class SingletonHolder{
        public static Singleton instance = new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

 

5.利用枚举Enum

在Java中,枚举可以看作一个类,其中也可以定义方法;而枚举中的变量可以看作该类的一个实例。枚举的构造方法限制为私有,在初次访问枚举实例时执行;而枚举中的实例定义为static final,从而只可实例化一次。

class SingleTon{}
​
enum SingleEnum{
    myEnum;          // 枚举实例
    private SingleTon singleTon;
    SingleEnum() {       // 构造方法,默认为private
        singleTon = new SingleTon();
    }
    public SingleTon getSingle(){
        return singleTon;
    }
}

实例的获取:

SingleTon s=SingleEnum.myEnum.getSingle();

 

 

​

java设计模式之单例模式——Singleton pattern 设计模式故事会:https://blog.youkuaiyun.com/weixin_40205234/article/details/90664824 单例模式 单例模式(Singleton pattern)是java中最常见的设计模式之一。该模式属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一... 阅读详情

相关推荐

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2405

单例模式

单例模式: 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 单例模式注意事项: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 意图: ...

weixin_34228387的博客 331

【STM32】IEC60730 Class B软件安全实现 Part2:自检库实战指南

本文是STM32 IEC60730 Class B软件安全实现的实战指南,详细介绍了如何将X-CUBE-CLASSB自检库集成到用户项目中。内容涵盖软件包解构、内存划分、启动与运行时自检的集成步骤、关键代码示例及调试技巧,并阐述了为最终通过安全认证所需的文档与流程准备,帮助开发者高效实现MCU功能安全。

weixin_29185167的博客 92

JAVA设计模式之单例模式

本文继续介绍23种设计模式系列之单例模式。 概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例...

一个本科小生的奋斗史 101万+

Pytorch的一小步,昇腾芯片的一大步

相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片!

机器学习-深度学习-图像处理-opencv-段子 5243

深入解析 TDA4VM/VH R5F 核中断机制:VIC 与非 VIC 模式下的实战对比与优化

本文深入解析了TI TDA4VM/VH平台中ARMv7-R架构R5F核的两种中断处理机制:VIC模式与非VIC模式。通过对比硬件自动跳转与软件向量表分发的核心流程、实战代码示例及性能差异,为开发者提供了基于实时性、灵活性与调试需求的选择指南和优化建议,帮助构建更稳定的嵌入式系统。

weixin_29159441的博客 99

java单例模式

定义:单例模式(Singleton)指一个类只有一个实例,并且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点;

qq_48268296的博客 4367

[DevExpress]GridControl拖拽行记录排序

DevExpress的GridControl拖拽行记录排序需求效果代码 需求 现在用户对按钮点击排序不满意了, 希望拖拽排序。 重载GridControl控件,对MouseMove、MouseDown、MouseUp事件修改一下。 效果 代码 using System; using System.Drawing; using System.Windows.Forms; using xiaoid.forms; using System.Data; using System.Collections.Gener

德仔 1563

Java五种单例模式

Java的五种单例模式,大家应该都接触过或者都用过。本篇介绍下Java的五种单例模式,并分析其优缺点,希望给初学者提供一点帮助。

zhaojun的博客 2万+

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 346

DJI O2协议物理层逆向工程解析:揭开无人机通信的神秘面纱

DJI的O2协议是其OcuSync传输技术的最新演进,应用于Mini 2、Mavic Air 2、Mavic Air 2s和Mavic 3等无人机模型。这种协议结合了多种先进无线通信技术,能够在远距离提供稳定可靠的低延迟连接。O2协议物理层(PHY)是OSI模型的最底层,负责在物理媒介上传输原始数据比特流。它定义了电气特性、调制方式、编码方案、数据传输速率和同步机制等。DJI O2协议的物理层逆向工程是一个复杂但极具价值的领域。

QQ_778132974的博客 2389

Java 单例模式

饿汉式单例模式 操作步骤如上所示。 懒汉式单例模式 上面的例子中 懒汉式是不安全的。 2.区分饿汉式与懒汉式 饿汉式: 坏处:对象加载时间过长。 好处:饿汉式是线程安全的。 懒汉式: 好处:延迟对象的创建。 坏处:线程不安全。 3.单例模式的使用场景 优点: 由于单例模式只生成-一个实例,减少了系统性能开销,当一个对象的 .产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。 ...

我不想学习但是必须学习 424

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 103

Java设计模式-单例模式(多种实现)

设计模式-单例模式 单例模式(Singleton,也叫单子模式,是一种常用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候,整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,显然,这种方式简化了在复杂环境下的配置管理。 简单来说使用单例模式可以带来下面几个好处: 对于频繁使用的对象,可以省略创建对象所花费的

老洋人的博客 322

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java设计模式之单例模式(多种实现方式)

Java设计模式之单例模式(多种实现方式)

cl617287的博客 2096

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

设计模式:单例模式多种实现及应用场景Java版

单例模式是最简单也是最常用的设计模式之一,今天我们就从多种情况下分析单例模式的设计技巧,包括懒加载、并发、枚举等多种设计方式

扶苏葳蕤 1384

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 设计模式应用:单例模式的多种实现方式及优缺点

一、单例模式概述在软件开发领域,设计模式是针对反复出现的问题总结归纳出的通用解决方案。单例模式(Singleton Pattern)作为创建型设计模式中的一种,旨在确保一个类在整个应用程序中仅有一个实例,并提供全局访问点。这种模式的核心作用在于控制资源的使用,避免对资源的重复创建和消耗,提升系统的性能和稳定性。在实际应用场景中,单例模式具有广泛的用途。例如,日志记录器(Logger)在整个应用程序中只需要一个实例来统一记录日志信息,这样可以保证日志格式的一致性和日志记录的准确性;

数字魔方操控师的博客 1100

java设计模式之单例模式(附多种实现方式)

一、单例模式介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。简单说就是,整个程序有且仅有一个由该类提供的实例对象。当频繁创建对象需要消耗大量资源,或者在java应用中需要使用唯一全局实例变量时,都可以使用单例模式。 特点: 单例类只能有一个实例; 单例类持有自己类型的属性; 单例类对外提供获取该实例的静态方法。 主要优点: 避免频繁的创建销毁对象,可以提高性能; 在内存中只有一个对

Coder-文小白的博客 326

架构设计之设计模式 (四) Java中多种方式实现单例模式

简介 “单例”即单一实例从名字上望文生义即可知道该类是做什么的,可见设计模式的名字也是很重要的,让人通过名字就能知道模式的用途,通用性强我们再命名自己的模式、函数、过程等时候也要遵循这一命名原则,这也成为了编程中一个不成文的规定。 GOF是这样定义的:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 特点 有状态 一个单例对象可以是有状态的(Sta

李龙生 3031

Java 设计模式 - 单例模式

Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录Java 设计模式 - 单例模式单例设计模式介绍单例设计模式八种方式饿汉式 - 静态常量饿汉式(静态常量)应用实例优缺点说明饿汉式 - 静态代码块饿汉式(静态代码块)应用实例优缺点说明懒汉式 - 线程不安全懒汉式线程不安全应用实例优缺点说明懒汉式 - 线程安全,同步方法懒汉式线程安全,同步方法应用实例优缺点说明懒汉式 - 线程安全,同步代码块懒汉式 线程安全,同步代码块应用实例优缺点说明懒汉式 - 双重检查 - 推

霍英俊 1736

5分钟掌握设计模式之:单例模式

5分钟掌握设计模式之:单例模式 本文思维导图 什么是单例模式 简介 单例模式属于创建型模式,它保证一个类只有一个实例,并提供唯一节点访问该实例。 单例模式主要解决一个全局使用的类被频繁地创建与销毁对象,浪费系统资源的问题。 使用单例模式时首先要判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 单例模式的构造函数是私有的。 单例模式是设计模式中使用很频...

木头人i 1126

java设计模式之 singleton 单例模式

单例模式是:一个类在任何情况下都绝对只有一个实例。需要控制实例数量,防止实例重复创建、销毁,造成资源浪费。单例模式的实现方式,大致有8中写法:两种写法 2.懒汉式写法 缺点: 不能防止反序列化 优点: 按需使用 (只有在用到的时候才会实例化对象) 写法一:线程不安全 写法二:线程安全,但效率降低 写法三:双重检查,线程安全,但不够完美 写法四:静态内部类写法,线程安全(由 jvm 保证线程安全),相对完美 3.枚举写法 比较完美的写法......

XQ的博客 348

Java设计模式—单例模式精讲

相信学习Java的同学们对设计模式这个概念并不陌生,不管是在学习还是在求职面试的过程中我相信大家都或多或少接触过设计模式这个字眼。不知道大家在学习SSM(Springboot-Spring-Mybatis)框架的时候会不会存在疑问,咱们一个服务至少由三部分组成,即控制层到服务层,最后就是咱们的数据层。咱们创建这些业务对象使用的是Spring的控制反转,将跟项目相关的类通过反射的方式加入到IOC容器。像咱们Controller层、Service层都很好理解,我们只需要在Spring的核心配置文件扫描对应的类,

zjjcchina的博客 268

Java设计模式之单例模式

Java设计模式之单例模式 一 单例模式介绍及方式 介绍 单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 八种方式 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 二 饿汉式 步骤 (1) 构造器私有化(防止new) (2) 类的内部创建对象 (3) 向外暴露一个静态的公共方法:getInstance

hcyxsh的博客 119
上一篇: 创建模块作为依赖并开源到JitPack
下一篇: ThreadLocal--无同步线程安全之《线程本地存储》
HanZhizhi
博客等级 码龄11年 297粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值