【Java进阶营】Java设计模式-单例模式:单例的六种实现

详解设计模式:单例的进化之路 尽管实现单例模式的具体思想和方法多种多样,也各有千秋和不足,但在实际的使用中,并不是最优的就是最合适的,在使用单例模式时,应该结合具体的项目需求以及场景来选择合适的实现方式。当然,除了上面的两个分类之外,处于对性能、安全等方面的考量,单例模式还演化出了各种实现版本,每一种版本的演进,都是单例的一次**进化与升级,**下面就来看看单例模式的进化之路上都经历了哪些挑战与对抗。实现,该单例不能保证其创建的对象是全局唯一,但是能保证在单个线程中是唯一的,在单线程环境下线程天生安全。测试结果:true。 阅读详情

单例模式的定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

UML类图

image

单例类的构造函数是 private 内部私有的,确保外部不能通过 new 的方式创建新对象,内部自行实例化,并对外提供一个访问该单一实例的静态的方法 Instance() 。

单例模式的实现

普通饿汉式

/**
 * 普通饿汉式
 *
 * @author anlingyi
 */
public class Singleton {
    /**
     * 类加载时进行实例化对象
     */
    private static final Singleton SINGLETON = new Singleton();

    /**
     * 私有构造,防止外部new对象
     */
    private Singleton() {

    }

    /**
     * 通过静态方法获取对象实例
     *
     * @return
     */
    public static Singleton getInstance() {
        return SINGLETON;
    }

    public void say() {
        System.out.println("普通饿汉式:Hello World!");
    }
}

调用方式:

Singleton singleton = Singleton.getInstance();
singleton.say();

优缺点
优点: 类加载时就进行实例化,之后的操作效率会很高。
缺点: 由于类加载时就进行实例化,如果后续不对此类进行任何操作,就会导致内存的浪费。

线程不安全的懒汉式

/**
 * 懒汉式(线程不安全)
 *
 * @author anlingyi
 */
public class SingletonTwo {

    private static SingletonTwo instance;

    /**
     * 私有构造,防止外部new对象
     */
    private SingletonTwo() {

    }

    /**
     * 通过静态方法获取对象实例
     *
     * @return
     */
    public static SingletonTwo getInstance() {
        if(instance == null) {
            instance = new SingletonTwo();
        }

        return instance;
    }

    public void say() {
        System.out.println("懒汉式(线程不安全):Hello World!");
    }
}

调用方式:

SingletonTwo singleton = SingletonTwo.getInstance();
singleton.say();

优缺点
优点: 在第一次调用的时候才进行实例化。
缺点: 当多个线程同时进入到 if(instance == null) {…} 时,会创建多个对象。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

同步锁懒汉式

/**
 * 同步锁懒汉式(线程安全,效率低)
 *
 * @author anlingyi
 */
public class SingletonThree {

    private static SingletonThree instance;

    /**
     * 私有构造,防止外部new对象
     */
    private SingletonThree() {

    }

    /**
     * 通过静态方法获取对象实例
     *
     * @return
     */
    public static synchronized SingletonThree getInstance() {
        if(instance == null) {
            instance = new SingletonThree();
        }

        return instance;
    }

    public void say() {
        System.out.println("同步锁懒汉式(线程安全,效率低):Hello World!");
    }
}

调用方式:

SingletonThree singleton = SingletonThree.getInstance();
singleton.say();

优缺点
优点: 在第一次调用的时候才进行实例化,且线程安全。
缺点: 使用 synchronized 的方式对方法加锁,会影响效率。

双重校验锁懒汉式

/**
 * 双重校验锁懒汉式(线程安全,且多线程环境下可以保持高性能)
 *
 * @author anlingyi
 */
public class SingletonFour {

    /**
     * volatile是为了防止指令重排序
     */
    private static volatile SingletonFour instance;

    /**
     * 私有构造,防止外部new对象
     */
    private SingletonFour() {

    }

    /**
     * 通过静态方法获取对象实例
     *
     * @return
     */
    public static SingletonFour getInstance() {
        if(instance == null) {
            synchronized (SingletonFour.class) {
                if(instance == null) {
                    instance = new SingletonFour();
                }
            }
        }

        return instance;
    }

    public void say() {
        System.out.println("双重校验锁懒汉式(线程安全,且多线程环境下可以保持高性能):Hello World!");
    }
}

调用方式:

SingletonFour singleton = SingletonFour.getInstance();
singleton.say();

优缺点
优点: 在第一次调用的时候才进行实例化,且线程安全,效率较高。
缺点: 实现复杂,且 volatile 需要在JDK1.5之后的版本才能确保安全。

静态内部类懒汉式

/**
 * 静态内部类懒汉式
 *
 * @author anlingyi
 */
public class SingletonFive {

    /**
     * 私有构造,防止外部new对象
     */
    private SingletonFive() {

    }

    /**
     * 通过静态方法获取对象实例
     *
     * @return
     */
    public static SingletonFive getInstance() {
        return Singleton.SINGLETON;
    }

    public void say() {
        System.out.println("静态内部类懒汉式:Hello World!");
    }

    /**
     * 静态内部类实例化对象
     */
    private static class Singleton {
        /**
         * 类加载时进行实例化对象
         */
        private static final SingletonFive SINGLETON = new SingletonFive();
    }
}

调用方式:

SingletonFive singleton = SingletonFive.getInstance();
singleton.say();

优缺点
优点: 只有在调用 getInstance() 方法的时候,静态内部类才会被加载,从而对主类(我们需要的类)进行实例化,即线程安全,又效率高。
缺点: 多创建一个类。

枚举类饿汉式(防止反序列化)

/**
 * 枚举类饿汉式(防止反序列化)
 *
 * @author anlingyi
 */
public enum  SingletonSix {
    INSTANCE;

    public void say() {
        System.out.println("枚举类饿汉式(防止反序列化):Hello World!");
    }
}

调用方式:

SingletonSix singleton = SingletonSix.INSTANCE;
singleton.say();

优缺点
优点: 实现简单,防止反序列化生成多个实例,且线程安全。
缺点: Enum 需在JDK1.5之后版本使用。

单例模式的优缺点

优点
  • 单例模式在内存中只有一个实例,减少了内存开支,尤其是频繁的创建和销毁实例。
  • 由于只生成一个实例,所以减少了系统的性能开销。
  • 避免对资源的多重占用,例如写文件操作。
  • 单例模式可以在系统设置全局的访问点,优化和共享资源访问。
缺点
  • 单例模式不易扩展,若要扩展,除了修改代码外别无他法。
  • 单例模式对测试不利。
  • 单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不用关心它是否是单例的。
java单例模式实例 一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。 立即下载

相关推荐

C#海康威视摄像头控制,将IntPtr转换成Bitmap图片

C#通过skd控制海康威视摄像头,获取bitmap格式图片

ReflexMechanism的博客 6586

java单例模式 实例_详解Java单例模式5种实现方法

单例模式是最简单的设计模式之一,也是Java面试的高频题,有的甚至要求手写单例模式,下面我们就来详细讲解Java单例模式的5种实现方法。首先,我们来了解下创建单例的四大原则:构造方法必需是私有的;以静态方法或枚举返回实例;确保实例只有一个,尤其在多线程环境下确保反序列化时不会重新构建对象常用的单例创建方式有:饿汉式、懒汉式、双重锁检测式(DCL)、静态内部类、枚举模式,下面就来依次讲解一下:饿汉式...

weixin_34145350的博客 533

标准恢复二极管整流器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

报告页数: 150 图表数: 100 报告价格:¥16800 本文研究全球与中国市场标准恢复二极管整流器的发展现状及未来发展趋势,分别从生产和消费的角度分析标准恢复二极管整流器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。 主要生产商包括: Yangzhou Yangjie Vishay Intertechnology Power Semiconductors Inc Nexperia B

Fj69258的博客 5848

Java设计模式 —— 单例模式(Singleton)

Java设计模式 —— 单例模式(Singleton) 单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。” 定义 Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。” 特征: 只有一个实例对象,private构造函数 提供一个公有的方法获取实例对象,static getInstance方...

许浑的博客 626

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

数字后端实战指南 | Innovus Function ECO全流程解析(从LAB到Tapeout)

本文深入解析了在Cadence Innovus工具中进行Function ECO的全流程实战指南。从LAB环境搭建到Tapeout前的签核验证,详细拆解了Pre-mask与Post-mask ECO的核心步骤、关键命令(如ecoDesign)以及常见避坑方案。重点阐述了如何应对时序、DRC等挑战,并强调了备用单元管理与严格验证的重要性,是数字后端工程师提升综合能力的必备参考。

weixin_28452161的博客 639

Java设计模式-单例模式:单例的六种实现

原文地址:xeblog.cn/articles/16 单例模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 UML类图 单例类的构造函数是 private 内部私有的,确保外部不能通过 new 的方式创建新对象,内部自行实例化,并对外提供一个访问该单一实例的静态的方法 Instance() 。 单例模式的实现 普通饿汉式 /** * 普通饿汉式 * * @...

weixin_34383618的博客 256

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

设计模式- Singleton单例模式的8种写法

设计模式、单例模式

模式情怀的专栏 853

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 345

Java中的单例模式

java 单例模式

OneBaBa的专栏 1412

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

JAVA设计模式之单例模式

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

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java设计模式:单例模式之六种实现方式详解(二)

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目标是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在单例模式中,类的构造函数通常是私有的,以防止其他类实例化它。同时,该类提供一个静态方法或属性来获取该类的唯一实例。单例模式的应用场景包括需要频繁进行创建和销毁的对象、需要共享资源的情况以及需要全局唯一访问点的场景等。通过使用单例模式,可以节省系统资源、提高性能并避免对共享资源的多重占用。

码到三十五 5975

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【设计模式】单例模式 饿汉式单例与懒汉式单例

单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。它主要用于解决资源浪费、全局唯一访问入口和重复初始化问题,适用于配置中心、日志记录器等场景。Java实现方式包括懒汉式、饿汉式、双重检查锁定、静态内部类和枚举(推荐方式)。单例模式优点包括节省资源和全局访问,但也存在违反单一职责原则、不利于测试等缺点。实际应用中,枚举实现是最佳选择,其次是静态内部类实现。

weixin_44131922的博客 1437

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java设计模式 —— 单例模式

本文主要讲解Java设计模式中,最最基础的单例模式。

Designer 小郑的技术博客 4073

Java设计模式详解----单例模式

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用

Java小白的博客 致力分享每一天学到的知识 3934

【Java进阶】java设计模式之单例模式

单例设计模式在 Java 开发中是一种非常实用的设计模式,它可以确保一个类只有一个实例,避免了资源的浪费和数据不一致的问题。在使用单例模式时,还需要注意序列化和反序列化、反射攻击等问题,确保单例的唯一性和安全性。

小李同学的博客 1330

Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

目录设计模式简介单例模式的简介单例模式的实现实现方式一:饿汉式(单例对象立即加载)实现方式二:懒汉式(单例对象延迟加载)实现方式三:双重检测锁实现(不建议使用)实现方式四:静态内部类实现方式(懒加载方式)实现方式五:枚举单例模式总结 设计模式简介 将设计者的思维融入大家的学习和工作中,更高层次的思考! • 创建型模式: – 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。 • 结构型模式: – 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 • 行为型模式: – 模版方法模

weixin_43246215的博客 2万+

Java进阶【四】设计模式之单例模式

​ 上篇文章对工厂模式进行了详细的讲解,想必大家对设计模式合理运用的好处深有感触。本章节将介绍:单例模式与原型模式。本章节参考资料书籍《Spring 5核心原理》中的第一篇 Spring 内功心法(Spring中常用的设计模式)(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的)。

jcc4261的博客 1016

Spring单例Bean与单例模式的区别

Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext)中仅有一个实例。首先看单例模式,在一个JVM进程中(理论上,一个运行的JAVA程序就必定有自己一个独立的JVM)仅有一个实例,于是无论在程序中的何处获取实例,始终都返回同一个对象,以Java内置的Ru

甘焕的博客 2万+

【设计模式系列6】单例模式的8种写法及如何防止单例被破坏

单例模式的写法懒汉模式恶汉模式 懒汉模式 恶汉模式

zwx900102的博客 2590

8.Java设计模式-创建型模式-单例模式-反射对单例的破坏

Java设计模式-创建型模式-单例模式-反射对单例的破坏

Runnin_Athena的博客 1328

单例销毁_设计模式-单例模式

单例模式 优点 由于单例模式在内存中只有一个实例,减少了内存开支,特别是 一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优 化,单例模式的优势就非常明显。 由于单例模式只生成一个实例,所以减少了系统的性能开销,当 一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象 时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留 内存的方式来解决(在Java EE中采用单例模...

weixin_29216049的博客 720
上一篇: 【Java进阶营】微服务架构之「 API网关 」
下一篇: 【Java进阶营】Java面试题收集
jvm大志
博客等级 码龄5年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值