单例模式的多种实现

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型 本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。 阅读详情
package net.csdn.se.singletondemo;

/**
 * 线程安全的---懒汉式(懒加载)创建
 */
public class Singleton06 {

    //1\
    private Singleton06(){}

    /**
     * 2静态的内部类的方式来创建实例
     * 在内部类被加载和初始化时,才创建实例。
     * 静态内部类不会随着外部类的加载和初始化而初始化,而是在需要的时候才会进行加载和初始化
     */

    private static class Inner{
       private static Singleton06 INSTANCE = new Singleton06();
    }

    //3
    public static Singleton06 getInstance(){
        return Inner.INSTANCE;
    }

    public static void main(String[] args) {
        Singleton06 instance = Singleton06.getInstance();
        Singleton06 instance1 = Singleton06.getInstance();
        System.out.println(instance == instance1);//结果一直为True
    }


}

  1. 饿汉式创建三种方式
    package net.csdn.se.singletondemo;
    
    /**
     * 饿汉式直接创建单例
     * 1、只能创建一个实例 ---> 构造方法私有化
     * 2、创建出来的实例进行保存
     * 3、对外暴露
     * 总结:
     *      1、优点:基于classloader机制来创建的单例,没有不加锁执行效率高、但是也避免了线程安全问题
     *      2、缺点:类加载时即初始化了实例,因此没有达到lazyloading(延迟加载)的效果对于那些创建出来没有被使用的也没有被回收的类来说,导致浪费内存空间
     */
    public class Singleton01 {
    
        //1. 第一步,构造方法私有化,只创建一个实例
        private Singleton01(){}
        //2. 第二步,对创建出来的实例进行保存
        private static Singleton01 INSTANCE = new Singleton01();
        //3、第三步 对外进行暴露
        public Singleton01 getInstance(){
            return INSTANCE;
        }
    
    
    }
    
    package net.csdn.se.singletondemo;
    
    /**
     * 饿汉式 枚举的方式创建单例
     * 特点:
     *    代码简单,实现容易
     */
    public enum Singleton02 {
        INSTANCE;
    }
    
    class Singleton02Test{
        public static void main(String[] args) {
            Singleton02 instance = Singleton02.INSTANCE;
        }
    }
    package net.csdn.se.singletondemo;
    
    import javax.sound.midi.Soundbank;
    import java.io.IOException;
    import java.util.Properties;
    
    /**
     * 饿汉式实例
     * 使用静态代码块的方式创建单例
     */
    public class Singleton03 {
    
        //2\ 第二要素 进行保存
        private static Singleton03 INSTANCE; //
        static {
            INSTANCE  = new Singleton03();   //类加载的时候 可以写业务逻辑 
            //加载配置文件
            Properties properties = new Properties();
            try {
                properties.load(Singleton03.class.getClassLoader().getResourceAsStream("jdbc.properties"));
                String username = properties.getProperty("userName");
                String password = properties.getProperty("password");
                System.out.println(username);
                System.out.println(password);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //1 第一要素 构造方法私有化
        private Singleton03(){}
    
        //3 对外暴露
        public static Singleton03 getInstance(){
            return  INSTANCE;
        }
    
    
        public static void main(String[] args) {
            Singleton03 instance = Singleton03.getInstance();
            Singleton03 instance2 = Singleton03.getInstance();
            System.out.println(instance == instance2);
        }
    
    }
    

     

     

     

  2. 懒汉式创建三种方式
    package net.csdn.se.singletondemo;
    
    import java.awt.*;
    
    /**
     * 线程不安全的方式创建单例---懒汉式
     * 线程安全的方式创建单例 添加synchronized----懒汉式
     * 优点:layloading,第一次调用的使用才初始化,避免了内存的浪费
     * 缺点:必须加锁才能保证是单例的,影响了效率
     */
    public class Singleton04 {
        private static Singleton04 INSTANCE;
        private Singleton04(){}
    
    //    public static  Singleton04 getInstance(){ 线程不安全创建方式
        public static synchronized Singleton04 getInstance(){  //线程安全创建方式
            if(INSTANCE == null){ //
                INSTANCE = new Singleton04();
            }
            return INSTANCE;
        }
    }
    
package net.csdn.se.singletondemo;

/**
 * 线程安全的---懒汉式(懒加载)创建
 * 静态内部类不能传递参数
 */
public class Singleton06 {

    //1\
    private Singleton06(){}

    /**
     * 2静态的内部类的方式来创建实例
     * 在内部类被加载和初始化时,才创建实例。
     * 静态内部类不会随着外部类的加载和初始化而初始化,而是在需要的时候才会进行加载和初始化
/**
     * 2静态的内部类的方式来创建实例
     静态内部类的优点是:外部类加载时并不需要立即加载内部类,
     内部类不被加载则不去初始化INSTANCE,故而不占内存。
     即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,
     才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,
     这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

     那么,静态内部类又是如何实现线程安全的呢?
     getInstance()方法,Inner.INSTANCE,取的是Inner里的INSTANCE对象,
     跟上面那个DCL方法不同的是,getInstance()方法并没有多次去new对象,
     故不管多少个线程去调用getInstance()方法,取的都是同一个INSTANCE对象,
     而不用去重新创建。当getInstance()方法被调用时,Inner才在Singleton06的运行时常量池里,
     把符号引用替换为直接引用,这时静态对象INSTANCE也真正被创建,然后再被getInstance()方法返回出去,
     这点同饿汉模式。那么INSTANCE在创建过程中又是如何保证线程安全的呢?在《深入理解JAVA虚拟机》中,有这么一句话:

     虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。如果在一个类的<clinit>()方法中有耗时很长的操作,就可能造成多个进程阻塞(需要注意的是,其他线程虽然会被阻塞,但如果执行<clinit>()方法后,其他线程唤醒之后不会再次进入<clinit>()方法。同一个加载器下,一个类型只会初始化一次。),在实际应用中,这种阻塞往往是很隐蔽的。

     故而,可以看出INSTANCE在创建过程中是线程安全的,所以说静态内部类形式的单例可保证线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
       */
     */

    private static class Inner{
       private static Singleton06 INSTANCE = new Singleton06();
    }

    //3
    public static Singleton06 getInstance(){
        return Inner.INSTANCE;
    }

    public static void main(String[] args) {
        Singleton06 instance = Singleton06.getInstance();
        Singleton06 instance1 = Singleton06.getInstance();
        System.out.println(instance == instance1);//结果一直为True
    }


}

 

史上最牛逼的导航网站(很全很详细) 今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h... 阅读详情

相关推荐

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6182

单例模式&&volatile

引用文章 23 种设计模式详解(全23种) 一个volatile跟面试官扯了半个小时 单例模式 定义:确保一个类最多只有一个实例,并提供一个全局访问点 单例模式可以分为两种:预加载和懒加载 预加载 顾名思义,就是预先加载。再进一步解释就是还没有使用该单例对象,但是,该单例对象就已经被加载到内存了。 public class PreloadSingleton { public static PreloadSingleton instance = new PreloadSingle

qq_43521665的博客 3256

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2584

volatile应用-单例模式及单例模式的完全理解

volatile应用-单例模式及单例模式的完全理解

m0_37329981的博客 438

再见 n8n?Google Opal 实测:一句话生成 APP,这才是 AI 的正确打开方式!

Google Opal深度评测:这款自然语言生成工作流的AI工具,通过三个实战案例(科技早报生成器、冰箱食谱助手、爆款文案转译机)展示了其零代码开发的强大能力。它凭借Gemini 3.0 Pro和Google生态的无缝集成,将自动化门槛降至新低,预示着一个“意图驱动开发”的新时代。

莫潇羽的个人博客 848

Qt6.8.0(win64)安装教程

启动 Visual Studio 2022 Community,选择 “继续但无需代码” 运行,然后打开Option设置,Add一条版本配置,Location 选择 D:\Qt\6.8.0\msvc2022_64\bin\qmake,点击确定。我是win11系统,所以选择windows版,下载路径二选一即可。方案1:默认情况下,额外勾选图中两个组件(总共40多G)方案2:按图中自定义勾选组件(总共5.8G)选择Custom Installation。我选的方案2,总共5.81G。

D4G1TIAO的博客 9072

单例模式为什么使用volatile,以及双重检查&单例模式的一些思考

也就是第一个if(singleton==null),这个是为了代码提高代码执行效率,由于单例模式只要一次创建实例即可,所以当创建了一个实例之后,再次调用getInstance方法就不必要进入同步代码块,不用竞争锁。直接返回前面创建的实例即可。

qq_43842093的博客 2544

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

深入理解单例模式:静态内部类单例原理

本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理。OK,废话不多说,进入正文。 首先我们要先了解下单例的四大原则: 构造方法私有。 以静态方法或者枚举返回实例。 确保实例只有一个,尤其是多线程环境。 确保反序列化时不会重新构建对象。 看一下静态内部类的单例模式的代码: public class Singleton05 { private Sing...

worldchinalee的博客 477

Unity3D实现项目限制功能(使用次数限制和时间限制)

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。在软件开发的时候,可能会遇到程序的使用次数限制,以及时间的限制,下面就写一下这两种方法是新建注册表,增加键值对,修改键值,完成对程序的控制提示:以下是本篇文章正文内容,下面案例可供参考以上就是讲了两种限制方法不定时更新Unity开发技巧,觉得有用记得一键三连哦。

心疼你的一切博客 1811

在 NVIDIA DGX Spark 上运行 vLLM + Open WebUI

DGX Spark 和 GX10 都是性能强大的机器,但只有将它们视为交互式工作站而非精简版服务器,才能真正发挥它们的优势。合理利用共享资源,规划并发工作负载,并谨慎控制内存限制。做到这些,vLLM 与 Open WebUI 的结合就能成为可靠​​的日常工具,而不是脆弱的实验品。DGX平台本身价格不菲,但这并非体验此类硬件的唯一途径。多家厂商提供基于相同核心架构、价格更为亲民的系统,这些系统通常配备容量较小的固态硬盘或配置更为简化,但基本性能并未改变。

iCloudEnd的博客 1750

JAVA:【基础六】单例模式为什么使用volatile,以及双重检查

创建单例的双重检测机制,及volatile关键字的使用

叫我吕小布 2063

YOLOv11低光照检测性能优化:基于Retinexformer主干网络的深度改进实践

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!@[TOC]在自动驾驶、安防监控、遥感探测等关键领域,目标检测系统必须保证24小时全天候的可靠工作。然而,现有最先进的目标检测模型,包括YOLOv11,其训练数据大多源于光照良好的场景。当环境光照条件急剧下降时,图像会出现严重的噪声、低对比度、颜色失真和细节丢失,直接导致模型性能断崖式下跌。常规的解决方案如图像直方图均衡化或简单的伽马校正,往往收效甚微,甚至可能放大噪声,进一步干扰检测。

m0_71589036的博客 190

DotNetGuide单例模式多种实现

单例模式(Singleton Pattern)是设计模式中最简单但最常用的模式之一,它确保一个类只有一个实例,并提供一个全局访问点。在C#/.NET开发中,单例模式广泛应用于配置管理、日志记录、数据库连接池等场景。 本文将深入探讨单例模式的多种实现方式,分析各自的优缺点,并提供完整的代码示例。 ## 单例模式的核心原则 单例模式需要满足以下核心要求: 1. **唯一性**:确保类只有一个实...

gitblog_01088的博客 951

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++单例模式多种实现技巧介绍

C++单例模式多种实现技巧

weibin的技术共享 649

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

单例模式的多种实现方式?

单例模式是一种常用的设计模式,适用于需要全局唯一对象的场景。通过不同的实现方式,可以根据具体需求选择合适的单例模式实现。无论是饿汉式、懒汉式、双重检查锁定、静态内部类还是枚举实现,每种方式都有其优缺点。在实际开发中,应根据具体场景选择最合适的实现方式。23。

wang15510689957的博客 811

Camera2Demo

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

C# 单例模式的多种简单实现

C# 单例模式的多种简单实现 什么是单例模式? 这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了。点击这里 1.简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建对象自身, 如下: public class Singleton { private static Singleton _Single...

cxu123321的博客 196

单例模式的解释以及多种实现

1.什么是单例模式? 2.如果理解单例模式做什么用?优缺点?使用场景? 3.饿汉式和懒汉式: 4.手撕单例模式 1.饿汉 (这其实就是静态工厂方法) 2. 线程不安全 + 懒汉 3. 单锁线程安全 + 懒汉 4. DCL双重检测(会失效版本) 5. 正常版的双重检测实现单例(使用了volatile) 6. 利用静态内部类实现线程安全的懒汉式单例模式 7. 利用枚举实现单例 1...

小树的博客 534

Python之单例模式的多种实现

单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建...

weixin_30716725的博客 85

单例模式多种方法实现

多种方式实现单例模式

u011210902的博客 221

C++:谈谈单例模式的多种实现形式

C++ 实现单例模式的多种形式,C++ 11 magic static 特性

you_fathe的博客 1082

Java中实现单例模式的多种方法:原理、实践与优化

单一实例:一个类在整个应用程序生命周期中只有一个实例。全局访问:通过静态方法或全局访问点获取该实例。延迟初始化(可选):实例在首次使用时创建(懒加载)。单例模式的核心在于控制实例创建,防止外部通过new构造多个实例。Java 中的单例模式有多种实现方式,包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。饿汉式和枚举:简单、安全,适合预加载场景。双重检查锁和静态内部类:支持延迟加载,适合高并发。懒汉式(同步):低并发场景的折中选择。

lssffy的博客 1023

Python单例模式的多种实现方式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

Python编程学习的博客 1387

java中单例模式的多种实现

最近在复习JAVA知识,才发现我们平时使用的单例模式有多种实现,赶紧记录下,方便以后COPY. 测试类 /** * 单例的多种写法 * @author Administrator *单例模式的优势: *对于项目中频繁使用的对象,可以节省创建对象的时间。 *因为new的操作次数减少,对系统内存使用的频率也会减少,减少GC压力 */ public class SingleInstan...

true100的专栏 372
上一篇: static关键字和static代码块执行顺序
下一篇: List接口的实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值