设计模式学习之单例模式

Java的23设计模式学习(课时一)单例模式 ◆设计模式的本质是面向对象设计原则的实际运用, 是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 ◆正确使用设计模式具有以下优点: ◆可以提高程序员的思维能力、编程能力和设计能力。 ◆使程序设计更加标准化、 代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。 ◆使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 阅读详情

单例模式

单例模式属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建在当前进程中有且只有的一个实例(根据需求不同,也可以是在一个线程中有且只有一个实例)
主要意图:有且只有一个实例
主要解决:类的频繁创建与销毁
使用地点:想要控制实例的数量,节省系统资源
实现单例模式有六种实现方法:

1. 单例模式之饿汉式单例

是否多线程安全:是
优点:没有加锁但是线程安全
缺点:浪费内存,容易产生垃圾对象
重点:饿汉式线程安全
线程安全的主要是因为会在声明类的时候就会创建内部私有对象,不会因为多线程而产生多个对象
代码如下:

/**
 * 饿汉式单例模式
 * @author wt
 */
public class SingletonPatternHunger {
    /**内部私有静态对象*/
    private static SingletonPatternHunger singleton = new SingletonPatternHunger();
    /**私有化无参构造方法*/
    private SingletonPatternHunger(){}
    /**获取对象接口*/
    public static SingletonPatternHunger getSingleton() {
        return singleton;
    }
}

2. 单例模式之懒汉式单例

懒汉式单例模式我认为是分为三种,分别是线程不安全的简单懒汉式,线程安全的方法锁懒汉式以及理论上线程安全的双检索懒汉式

2.1 线程不安全的简单懒汉式单例

是否多线程安全:否
优点:最基本的实现方法,可以在单线程中实现单例
缺点:多线程不安全
代码:

/**
 * 懒汉式单例模式
 * @author wt
 */

public class SingletonPatternLazy {
    /**先声明静态私有对象*/
    private static SingletonPatternLazy lazy;
    /**静态构造方法*/
    private SingletonPatternLazy(){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                /**异常信息,建议使用开源的log包来显示异常*/
                e.printStackTrace();
            }
            System.out.println("生成了一次对象");
    }
    /**
     * 简单懒汉式单例获取对象接口
     * 线程不安全
     */
    public static SingletonPatternLazy getLazy1(){
        if (lazy == null) {
        /**判断是否有对象,如果没有就创建对象*/
            lazy = new SingletonPatternLazy();
        }
        return lazy;
    }
}

2.2 线程安全的方法锁懒汉式

是否多线程安全:是
优点:第一次调用时才会初始化,避免内存浪费
缺点:每次获取对象都要进锁,影响效率
代码:

/**
 * 懒汉式单例模式
 * @author wt
 */

public class SingletonPatternLazy {
        /**先声明静态私有对象*/
        private static SingletonPatternLazy lazy;
        /**静态构造方法*/
        private SingletonPatternLazy(){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                /**异常信息,建议使用开源的log包来显示异常*/
                e.printStackTrace();
            }
            System.out.println("生成了一次对象");
        }
   /**
     * 方法锁懒汉式单例获取对象接口
     * 线程安全,但是太影响效率
     */
    public synchronized static SingletonPatternLazy getLazy2(){
        if (lazy == null) {
            /**判断是否有对象,如果没有就创建对象*/
            lazy = new SingletonPatternLazy();
        }
        return lazy;
    }
}

2.3 双检索懒汉式单例模式

双检索单例模式其实也是根据懒汉式单例模式进行的改变
jdk版本:1.5+
是否多线程安全:加上volatile关键字是线程安全的
优点:第一次调用时才会初始化,避免内存浪费。进行了判断,不会每次获取对象实例都进入锁
缺点:需要额外代码才可以实现反序列化和反射
重点:volatile

/**
 * 懒汉式单例模式
 * @author wt
 */

public class SingletonPatternLazy {
    /**
     * 先声明静态私有对象,重点volatile
     * 如果没有这个关键字,那么就不是线程安全的,有几率出现错误
     */
    private volatile static SingletonPatternLazy lazy1;
        /**静态构造方法*/
        private SingletonPatternLazy(){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                /**异常信息,建议使用开源的log包来显示异常*/
                e.printStackTrace();
            }
            System.out.println("生成了一次对象");
        }
        /**
     * 双检索懒汉式单例获取对象接口
     * 理论上线程安全,但是需要在声明对象时,加上volatile关键字
     */
    public static SingletonPatternLazy getLazy3(){
        if (lazy1 == null) {
            synchronized(SingletonPatternLazy.class){
                if (lazy1 == null){
                    /**判断是否有对象,如果没有就创建对象*/
                    lazy1 = new SingletonPatternLazy();
                }
            }
        }
        return lazy1;
    }
}

3. 静态内部类单利模式

是否多线程安全:是
优点:可以有效的实现懒加载
缺点:不能防止反射与序列化的破坏,并且只适用于静态域,如果要在实例域进行延迟加载建议使用双检锁单例
代码:

/**
 * 内部类单例模式
 * @author wt
 */
public class SingletonPatternInner {
    /**私有化构造方法*/
    private SingletonPatternInner(){
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            /**异常信息,建议使用开源的log包来显示异常*/
            e.printStackTrace();
        }
        /**用来测试多线程调用后生成对象的次数*/
        System.out.println("生成了一次对象");
    };
    /**获取内部类中生成的对象*/
    public static SingletonPatternInner getSingleton(){
        return SingletonHolder.Singletonholder;
    }
    /**在内部类中生成对象*/
    private static class SingletonHolder{
        private static final SingletonPatternInner Singletonholder= new SingletonPatternInner();
    }
}

4. 枚举单例

单例模式的最佳实现方法,可以有效的阻止反射和序列化破坏
参考链接(推荐):我做认为讲解枚举最好的博客,里面也包含枚举单例的讲解
jdk版本:1.5+
是否多线程安全:是
优点:单例模式的最佳实现方法,可以阻止反射和序列化攻击
缺点:在需要反射调用时会报错
代码:

/**
 * 枚举单例模式
 * @author wt
 */
public enum SingletonPatternEnum {
    /**静态常量对象*/
    INSTANCE;
    /**实验数据*/
    private String name;
    /**获取name*/
    public String getName() {
        return name;
    }
    /**输入name*/
    public void setName(String name) {
        this.name = name;
    }
}
零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程) 本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。 阅读详情

相关推荐

MobileNet V3 图像分类

MobileNet V3

Henry的博客 1768

设计模式学习-- 3.单例模式(Singleton Pattern)

======================================================================================================================================================== V3版本 練習的目標: 1.通過單例模式,獲取整形的唯一ID 2.兩個Main多線程同時測試。 package com.designepattern.singleton.v3; /...

u010031813的博客 160

[深度学习] 从 originbot 到 origincar

原来,OriginBot的摄像头是MIPI模式,而OriginCar的摄像头是USB摄像头,也就是imageWidth 是0~959,超过了范围640。origincar在执行以下命令部署模型时。

chdlr的博客 2384

设计模式 - 学习笔记 - 单例模式Singleton Pattern

设计模式 - 学习笔记 - 单例模式Singleton Pattern学习总结应用场景UML代码示例饿汉 hungry 学习总结 单列的核心就是这东西,我们只想要一份,无论多少人调用它。都是调这个实例。 饱汉:调用时才创建实例,能省点是点。 饿汉:初始化时直接生成实例,要用时直接调,无需等待。当然如果一直都没调它,那就活活浪费着。。。 Java实现中考虑线程安全问题,衍生出了8种方式。其实好多是凑数的没啥意义。 线程安全问题来自于饱汉模式运行时动态创建实例,多线程自然就会有撞车风险。饿汉模式就不存在线程安

灵台方寸山斜月三星洞 485

同花顺CM函数深度解析:如何精准设置历史换手衰减系数以优化筹码峰

本文深度解析同花顺CM函数中的历史换手衰减系数,揭示其如何影响筹码峰准确性。通过拆解CM函数参数,并提供基于前十大流通股东锁定比例的计算公式,指导用户精准设置该系数,从而优化筹码峰模型,使其更真实反映个股持仓成本分布,提升技术分析的有效性。

mango的博客 1764

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 272

Java设计模式学习(一):单例模式

本篇开始学习设计模式。 设计模式 先说明一下什么是设计模式 ? 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 个人理解就是对于软件开发过程中遇到的一般性问题的比较标准的解决性方案,是前辈们在长期试错总结得到的经验。 希望以后可以逐个学习。本篇从单例模式开始。 单例模式 单例模式的定义: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之.

阿秋的Blog 213

Windows服务器XMRig挖矿病毒深度清除实战指南

XMRig是一种广泛用于Monero(XMR)加密货币挖矿的开源工具,其在Windows环境中的持久化机制已远超传统木马范畴,融合WMI事件订阅、服务伪装、PowerShell无文件执行与注册表隐写等多重反检测技术。理解其基于行为而非特征的生存逻辑,是实现有效检测与根除的前提。该技术具备强隐蔽性、高自愈性与网络通信合法化特征,常见于RDP弱口令爆破、SMB共享泄露及PowerShell远程执行等非漏洞类入侵场景。本文聚焦Windows原生命令与Sysinternals工具链,提供覆盖进程定位、WMI清理、服

weixin_30535843的博客 730

HeadFirst 设计模式学习笔记5--单例模式

本文已搬家至【HeadFirst 设计模式学习笔记】5 单例模式

gnuhpc的专栏 2738

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3382

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

嵌入式阿齐Archie 2万+

《学习Java设计模式之单例模式(Singleton Pattern)》

单例模式(Singleton Pattern) 1、单例模式的概念 单例模式 又叫做 单态模式 或者 单件模式 。 单例模式 是指 保证JVM中一个类仅有一个实例 ,并提供一个访问它的全局访问点。 单例模式 中的 单例 通常用来代表那些本质上 具有唯一性的系统组件(或者叫做资源)。比如文件...

138

YOLOv5_DeepSORT_Pytorch训练自己的多目标跟踪模型

1 准备 环境配置:https://blog.youkuaiyun.com/weixin_50008473/article/details/115250986?spm=1001.2014.3001.5501 YOLOv5_DeepSORT_Pytorch代码地址: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch DeepSORT论文:https://arxiv.org/pdf/1703.07402.pdf 2 训练目标检测模型 训练自己的目标检测模

weixin_50008473的博客 1万+

设计模式-单例模式学习笔记及心得感悟

单例模式 单例模式的定义    确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。     通用代码如下 //饿汉单例模式public class Singleton{ private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singlet

mmrx的博客 993

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式学习笔记十:单例模式(Singleton Pattern)

设计模式学习笔记十:单例模式(Singleton Pattern)     1.概述     单例模式(Singleton Pattern)又称单件模式,单例模式保证一个类仅有一个实例,并提供一个访问的他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化对个对象,一个最好的办法就是,让类自身负责保存他的唯一实例,这个类可以保证没有其他实例可以被创建

AlbenXie的博客 483

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式学习总结-单例模式(Singleton Pattern)

问题:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,并提只有一个全局访问点,才能确保它们的逻辑正确性、以及良好的效率。 定义:单例模式也叫也叫单件模式是一种对象创建模式, 保证一个类仅有一个实例,并提供一个该实例全局的访问点。这个类称为单例类。 意图:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式有三个要点:一是某个类只能有一个实例;二是...

weixin_34144450的博客 92

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

AI 领航设计模式学习:飞算 JavaAI 解锁单例模式实践新路径

过去,想要深入学习设计模式,开发者往往需要啃读大部头的专业书籍,如经典的《设计模式》,或是在网络上大海捞针般筛选各类示例代码,不仅耗时耗力,学习效果也参差不齐。如今,飞算 JavaAI 的智能问答功能横空出世,彻底颠覆了传统的学习模式,为开发者开启了一条高效掌握设计模式的全新路径。它存在的意义又是什么?更值得一提的是,飞算 JavaAI 具备强大的个性化学习能力,它能够根据开发者的追问不断拓展内容深度,无论是基础概念的细化解释,还是复杂场景的解决方案,都能精准匹配学习需求,这是传统学习资料难以比拟的优势。

CalEx_Tech的博客 992

设计模式学习之——单例模式

单例模式

m0_70289867的博客 1564

设计模式学习之----单例模式

设计模式学习之----单例模式

weixin_39344648的博客 181

【 设计模式学习】单例模式

在面试的过程中屡屡被问到设计模式,出现频率很高,可见设计模式的重要性,所以,学习设计模式刻不容缓!先了解一下什么是设计模式?设计模式的定义: 设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。设计模式的分类:按照目的可分为三类,创建型模式,结构型模式,行为型模式;按照范围,即模式主要处理类之

John的博客 1076

【设计模式学习】单例模式和工厂模式

设计模式是在软件设计中反复出现的问题和解决方案的经验总结。它是对软件设计中常见问题的通用解决方案,可以帮助设计人员更高效地解决问题,并提高软件设计的质量和可维护性。设计模式提供了一种在特定情况下的解决方案,它们可以被反复使用,并且是经过验证的最佳实践。设计模式可以帮助开发人员更好地理解软件设计中的问题,并为他们提供一种标准的方法来解决这些问题。通俗易懂的一点来说:就是提高你的下限。

xiaoxie8023的博客 3001

学习设计模式之单例模式

单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 类结构图 单例模式有两种实现方式:恶汉式、懒汉式。 饿汉式代码示例 public class Singleton { private static final Singleton SINGLETON = new Singleton(); private Singleton() { } publ...

qq_16830879的博客 183

设计模式学习1:单例模式

单例模式是一种非常实用的设计模式,适用于需要全局访问且资源有限的场景。不同的实现方式各有优缺点,开发者可以根据具体需求选择合适的实现方式。例如:如果需要延迟加载且线程安全,可以选择静态内部类单例模式。如果对延迟加载没有要求,且希望实现简单,可以选择基于enum的单例模式。如果对延迟加载没有要求且希望在类加载时就初始化,可以选择饿汉式单例模式。无论选择哪种实现方式,都需要确保单例的线程安全性和全局唯一性,这是单例模式的核心要求。

weixin_42611375的博客 715

设计模式基础学习之单例模式

前言:单例模式(Singleton)是广泛使用的设计模式,主要作用是保证Java程序中某个类只有一个实例存在。特点:应用场景:一些管理器和控制器被设计为单例模式 。特点: 饿汉模式在类加载时就对实例进行创建, 实例在整个程序周期都存在。优点: 类加载时创建一次实例, 不会出现多个线程创建多个实例, 避免多线程同步问题。缺点: 即使单例未被使用也会在类加载之后被创建, 浪费内存空间 。适用场景: 单例占用内存小, 初始化时就会被使用。...

weixin_45301250的博客 257
下一篇: 大数据学习之 Linux基础配置
默默谦行
博客等级 码龄7年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值