【单例深思】静态内部类实现详解

Java单例模式:静态内部类实现原理剖析 单例模式的核心目标是控制类的实例数量,确保全局唯一访问点。为什么静态内部类能实现懒加载?如何通过JVM机制保证线程安全?与其他实现方式(如饿汉式、双重检查锁定)的本质区别?实际项目中的最佳实践与注意事项。本文将从生活场景引入单例模式需求,逐步拆解静态内部类实现的核心概念(懒加载、线程安全、类加载机制),结合JVM规范剖析原理,通过代码示例演示实现,最后总结最佳实践与常见问题。单例模式(Singleton Pattern):保证一个类仅有一个实例,并提供一个全局访问点。 阅读详情
静态内部类实现是我个人比较推荐的,其实现如下:

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton() {}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
 
上面实现中,通过声明一个静态内部类 SingletonHolder  来持有单例  INSTANCE   ,在 getInstance() 方法中返回该实例。

我们知道,静态内部类与非静态内部类之间有很大的区别,非静态内部类在编译完成之后会隐含地保存着一个 指向创建它的外围类的 引用,但是静态内部类却没有。这意味着 静态内部类 的创建是不需要依赖于外围类, 它不能使用任何外围类的非static成员变量和方法,某种程度上来说,静态内部类可以当成是一个独立的类。它的初始化和外部类初始化无关。

下面详细介绍一下它是如何解决单例中的各种问题的。

首先,它是如何实现延迟加载的?

由于 INSTANCE  在静态内部类中声明并实例化,在 【单例深思】饿汉式与类加载 中我们知道有且只有5种情况 会引发初始化操作, 初始化阶段是执行类构造器<clinit>()  方法的过程。 <clinit>()  方法是由编译器自动收集类中的所有类变量(static)的赋值动作和静态语句块(static{})块中的语句合并产生的。因为外部类初始化 不会引发静态内部类 SingletonHolder 的初始化,所以只有真正调用 getInstance() 方法,执行  SingletonHolder. INSTANCE  时,才会引发静态内部类初始化,从而完成实例化。所以,静态内部类实现是延迟加载的。


它如何保证实例化时线程安全?

既然静态内部类初始化可以当成为一个普通类的初始化,根据 在 【单例深思】饿汉式与类加载 中所描述的类加载过程,可以知道 虚拟机会保证一个类的 <clinit>() 方法在多线程环境中被正确的加锁、同步。所以, 静态内部类实现是在 实例化时是线程安全 。

在其他方面,由于在读取实例的时候不会进行同步,所以没有性能缺陷;没有使用  volatile ,也不依赖 JDK 版本。

总之,静态内部类实现单例由于编写简单,满足线程安全和延迟加载,无其他明显缺点,是一种在工作中用的比较多的方式。

86、机器人混合规划技术:融合深思与反应算法 本文探讨了机器人运动规划中深思算法与反应算法的融合技术。深思算法擅长在静态环境中规划最优完整轨迹,而反应算法能快速响应动态障碍物,二者互补性强。通过将深思轨迹的最后可见点作为子目标或采用固定距离设置子目标等融合策略,机器人可在保证路径最优性的同时具备良好的实时避障能力。文章还分析了不同融合架构的工作流程,并结合室内服务机器人和自动驾驶汽车的实际案例,展示了该技术在复杂环境中的应用价值。未来,随着场景复杂度提升,混合规划技术将在智能导航中发挥更大作用。 阅读详情

相关推荐

深入掌握Java内部类核心特性与应用实战

内部类不是炫技,而是一种深思熟虑后的架构选择。它的核心价值在于:强化封装:将实现细节隐藏在外部类内部,防止滥用;提升内聚:相关功能集中管理,逻辑更清晰;简化通信:无需显式传参即可共享状态;灵活组织:通过不同类型的内部类满足多样化需求。但也要清醒认识到:- 非静态内部类会增加内存开销和 GC 压力;- 匿名类可能导致内存泄漏;- Lambda 和 record 正在逐步替代部分传统用法。

weixin_35826166的博客 362

c++静态类实现

c++静态类 静态类 静态类实现 静态类声明

lendq的Blog 3万+

Java静态内部类实现单例过程

主要介绍了Java静态内部类实现单例过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

java静态内部类单例模式_单例模式-静态内部类实现及原理剖析

以我的经验为例(如有不对欢迎指正),在生产过程中,经常会遇到下面两种情况:1.封装的某个类不包含具有具体业务含义的类成员变量,是对业务动作的封装,如MVC中的各层(HTTPRequest对象以Threadlocal方式传递进来的)。2.某个类具有全局意义,一旦实例化为对象则对象可被全局使用。如某个类封装了全球的地理位置信息及获取某位置信息的方法(不考虑地球爆炸,板块移动),信息不会变动且可被全局使...

weixin_36015177的博客 1317

Java内部类应用之静态内部类应用示例

主要介绍了Java内部类应用之静态内部类应用,结合实例形式分析了Java静态内部类的原理、功能、用法及相关操作注意事项,需要的朋友可以参考下

MATLAB 设置legend加标题

x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon

早起CaiCai的学习空间 4713

单例模式详解

概述单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例。单例应用场景Windows系统的任务管理器。Windows系统的回收站。操作系统的文件系统,一个操作系统只能有一个文件系统。数据库连接池的设计与实现。多线程的线程池设计与实现。Spring中创建的Bean实例默认都是单例。Java-Web中,一个Ser...

程序员囧辉 5526

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

静态内部类实现单例

饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存,懒汉式单例类线程安全控制烦琐,而且性能受影响 静态内部类实现单例模式就可以克服以上两种单例模式的缺点,如下所示???? public class Singleton { private static class HolderClass{ private static final Singleton instance = new Singleton(); } public static Singl

Smartbbbb的博客 4436

MATLAB去雾算法实战:5种经典方法对比+1种改进方案(附完整源码)

本文详细对比了MATLAB中5种经典去雾算法(包括暗通道先验、多尺度Retinex等)的实现效果,并提出一种创新的自适应融合改进方案。通过完整的源码展示和性能对比,帮助开发者掌握图像去雾的核心技术,提升计算机视觉应用中的图像质量。特别针对去雾算法中的光晕效应问题,给出了工程实践中的优化技巧。

weixin_26801149的博客 412

RK3588 部署 YOLO26 目标检测:从训练到 NPU 推理

如果做垂直场景(工业缺陷、农作物、特定零件),需要自己标数据。采集图像(500+ 张,覆盖不同光照/角度)→ 筛选(删除模糊/无目标)→ LabelImg 标注(选择 YOLO 格式)→ 划分(train:val:test = 7:2:1)labelImg├── train/├── val/├── test/YOLO26 在 RK3588 上的全流程是 PC 端训练 + ONNX 导出 → RKNN 转换(INT8 量化)→ 板端推理。

m0_71589036的博客 110

【单例深思】单例与序列化

在前面的文章中提到,序列化会破坏单例模式,下面用静态内部类的实现方式,说明序列化对单例的影响: public class Singleton implements Serializable{     private static class SingletonHolder {         private static final Singleton INSTANCE = ne

InkGenius 1397

Python爬虫技术应用:体育赛事直播数据抓取与分析

Web爬虫(Web Crawling)是一种通过模拟浏览器行为从网站获取数据的技术。发送请求:发送HTTP请求(通常是GET或POST请求)获取目标网页的HTML内容。解析网页:使用解析工具(如lxml)从HTML中提取出所需要的信息。存储数据:将抓取到的数据存储到数据库、文件或数据结构中,供后续分析和使用。数据分析与展示:使用数据分析工具(如PandasMatplotlib)对数据进行处理、清洗和可视化,生成有价值的报告和图表。Requests:用于发送静态网页的HTTP请求并获取响应。

2201_76125261的博客 1309

【单例深思】饿汉式

1、抛出问题 为什么饿汉式单例是线程安全的? 为什么饿汉式单例没有延迟加载(Lazy Loading)? 2、JVM类加载机制 饿汉式单例的实现: public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() {} public static Singleton getInstance() {

何武昭的专栏 268

Autosar MCAL-S32K324 Fls配置-基于EB

Autosar MCAL Flash配置,基于S32K324,EB软件

赞的博客 1514

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

Design pattern ——singleton pattern(单例总结深思)

Talk is cheapShowmethecode 个人学习笔记--仅供参考 单例模式可以保证内存里只有一个实例,减少了内存开销;可以避免对资源的多重占用。 单例模式看起来非常简单,实现起来其实也非常简单。 总结一下, 前几章主要讲了 饿汉式: 1,经典饿汉式 2静态代码块饿汉式 优点:没有加任何的锁、执行效率比较高,在用户体验上来说,比懒汉式更好。 缺点:类加载的时候就...

xuedengyong的博客 156

告别Python中间件!C#原生调用YOLOv11/v12:工业视觉检测零语言壁垒全流程

本文介绍了一种基于C#和ONNX Runtime的工业视觉检测解决方案,解决了传统YOLO模型在工业应用中面临的三大痛点:语言壁垒、性能损耗和模型更新困难。该系统采用三层架构设计,支持C#原生调用YOLO模型,无需中间件,性能损耗低于5%,满足工业产线30FPS+的实时性要求。文章详细阐述了环境搭建、模型导出规范、核心代码实现及工业级优化方案,提供可直接用于生产环境的完整流程,实现了训练与部署的解耦,显著降低了维护成本。该方案兼容主流YOLO版本,支持全平台部署,为工业视觉检测提供了高效可靠的C#集成方案。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 186

【单例深思】饿汉式与类加载

我们知道饿汉式的实现是线程安全的,没有延迟加载(Lazy Loading),下面我们深入研究下为什么。 饿汉式的实现如下: public class Singleton {     private static Singleton singleton = new Singleton();     private Singleton() {}     public st

InkGenius 4574

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【单例深思】Java 单例模式全解

什么是单例模式? 单例模式 是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例,并提供一个访问它的全局访问点。 单例模式的用途? 用于创建只需要一个实例的场景。 怎么实现单例模式? 单例模式的实现中有几个共同特点: 使用 private 声明类构造函数,这样就不能通过new 声明这个

InkGenius 843

WINCC7.3破解文件

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

【java 基础】枚举深思之反编译枚举类,验证枚举实现单例是线程安全的

1、

李光 未来科技 445

Chromium 源码剖析:base::NoDestructor——更安全的静态单例解决方案

Chromium源码中广泛使用base::NoDestructor类来实现单例模式,它通过不调用析构函数的方式解决传统静态局部变量在程序退出时的析构顺序问题。文章分析了传统单例实现可能导致"静态析构顺序崩溃"的隐患,详细介绍了NoDestructor的设计原理:使用placement new构造对象但不调用析构函数,依赖操作系统回收内存。该方案适用于进程级单例、全局配置等场景,但不适合需要显式释放资源的对象。相比旧版LazyInstance,NoDestructor具有更简洁、内存开销更

John_ToStr的博客 477

Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南

这是单例模式的首要目标。它通过特定的类结构设计(最关键的是私有化构造方法private),阻止了外部代码像普通类一样随心所欲地使用new来创建实例,从而保证在整个 JVM 进程中,该类最多只存在一个对象实例。实例的创建权被牢牢控制在类自身手中。在确保实例唯一之后,还需要提供一个公开、便捷的方式让系统的其他部分能够获取到这个唯一的实例。这通常通过在该类内部定义一个公共的 (public) 静态的 (static) 方法来实现,约定俗成的名称是。它如同这个唯一实例的“官方指定联系方式”。

码觉客的博客 661

【单例深思】懒汉式改进版与内置锁

我们知道懒汉式的实现是延迟加载(Lazy Loading),但是不是线程安全的,下面我们深入研究下为什么。 懒汉式的实现如下: public class Singleton {     private static Singleton singleton;     private Singleton(){}     public s

InkGenius 1501

深思iOS应用加固方案

方案简介 深思iOS应用加固方案(VirboxProtector)基于虚拟机保护技术,无需启用 Bitcode,无需替换 Xcode 编译器,可以从可执行文件中直接解析出 ARM 指令,然后进行代码混淆和虚拟化。专业的加固技术,为应用本身及重点模块提供高强度的防护,有效避免应用被破解、逆向、篡改等风险。 深思iOS应用加固产品功能 防逆向 采用整体和混合加固保护,并对核心逻辑代码进行虚拟化保护,有效防止攻击者使用逆向分析工具将二进制代码反编译为伪代码。 防篡改 在应用启动时,对内存进行完整性

Firshare-分享值得的分享 1203

面试题:单例,还是单例

今天表弟问道一个面试题,结果票眼一看,尽然我回答错误了。值得深思: package com.io.test; class Singleton { private static Singleton singleton = new Singleton(); public static int counter1; public static int counter2 = ...

iteye_11158的博客 258
上一篇: 【单例深思】双重检测锁与Java内存模型
下一篇: 【单例深思】单例与序列化
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值