静态内部类单例

简介: 静态内部类单例

1、简介

静态内部类单例是一种线程安全的单例实现方式,它利用了Java 的类加载机制来实现单例模式。

它的实现思路是将单例的实例放在一个静态内部类中,在第一次调用单例对象时再进行创建。这种实现方式既能保证线程安全,又能保证单例对象的延迟加载。

2、代码实现

1. public class Singleton {
2. //Singleton单例
3. private Singleton(){}
4. private static class SingletonHolder{
5. private static final Singleton INSTANCE = new Singleton();
6.     }
7. public static Singleton getInstance(){
8. return SingletonHolder.INSTANCE;
9.     }
10. }

3、优缺点

优点:

①线程安全:由于使用了Java类加载机制,单例对象在类加载阶段就已经创建好,并且只会创建一次,因此是线程安全的。

②类加载性能优秀:在使用单例对象时才会进行创建,而且只会创建一次,在资源有限的情况下能够节约内存。

③使用简单:通过Singleton.getInstance()来获取单例对象

缺点:

①可能会增加类的数量,因为需要一个静态内部类来保存单例对象

②第一次加载时可能会略微增加启动时间

总结来说,静态内部类单例是一种实现单例模式的优秀方式,它既保证了线程安全,又具有很好的类加载性能,并且使用起来非常方便。

4、应用场景

静态内部类单例模式非常适合在需要频繁使用、且资源占用较小的单例对象时使用。

常见的应用场景有:

①工具类:比如日期处理工具类、字符串工具类等

这些工具类一般需要非常频繁地使用,而且资源消耗也不大,所以可以使用静态内部类单例模式来实现。

1. public class DateUtils {
2. private DateUtils(){}
3. private static class DateUtilsHolder {
4. private static final DateUtils INSTANCE = new DateUtils();
5.     }
6. public static DateUtils getInstance() {
7. return DateUtilsHolder.INSTANCE;
8.     }
9. public String formatDate(Date date){
10. //do format job
11.     }
12. }

②日志管理类:由于日志管理类可能会在多个地方使用,并且资源消耗也不大,所以可以使用静态内部类单例模式来实现。

1. public class Logger {
2. private Logger(){}
3. private static class LoggerHolder {
4. private static final Logger INSTANCE = new Logger();
5.     }
6. public static Logger getInstance() {
7. return LoggerHolder.INSTANCE;
8.     }
9. public void log(String message){
10. //do log job
11.     }
12. }

静态内部类的实际应用场景不局限在这里,还有很多其他场景可以使用,如配置管理类、高效缓存类等。

相关文章
|
关系型数据库 MySQL 数据库
如何更改mysql可执行路径及更改mysql数据库文件路径
一、如何更改服务中MySQL的可执行文件路径: 解决方法:到注册表里HKEY_LOCAL_MECHINE---SYSTEM ---CurrentControlSet 更改查找一、 MySQL项值,然后改路径。
3743 0
|
安全 Java Linux
一文了解 Maven 的 settings.xml 配置文件
一文了解 Maven 的 settings.xml 配置文件
2801 0
获取apk的签名信息
在接入第三方功能时,经常要注册提交apk的签名信息 (sha1签名)?,下面列出相关步骤。 获取apk签名信息的步骤: 1)修改apk后缀名为zip,解压得到其中的META-INF文件夹; 2)把META-INF文件夹放到C盘根目录下; 3)在dos面板中,  敲入命令:  keytool -printcert -file C:\META-INF\CERT.
6451 0
|
Oracle 关系型数据库 MySQL
MySQL中Sequence的使用
Oracle中Sequence可以使用,但在MySQL中没有序列实现,Oracle往MySQL迁移Sequence要怎么处理,是否有替代方案呢?
4569 0
|
2月前
|
云安全 人工智能 弹性计算
豆包手机助手引爆geo优化新生态 百云腾首发适配方案抢占10亿流量入口
2025年AI生态迎来“三驾马车”:字节豆包、快手灵境、云智联盟协同发力。百云腾首创“云智底座+双平台应用”全栈方案,实现跨层级适配,助力企业曝光提升4.6倍、转化周期缩短52%,成为贯通geo优化全链路的领军服务商。(238字)
210 2
|
6月前
|
人工智能 算法 Android开发
如何使用Singify AI人声去除器去除歌曲人声
Singify人声去除器是一款高效易用的AI音频工具,支持在线快速分离歌曲中的人声与伴奏,适用于卡拉OK、翻唱、视频配乐等创作场景。无需专业技能,上传音频或输入YouTube链接,几步操作即可获得高质量伴奏或人声音轨。支持2轨、4轨、6轨甚至10轨分离,满足多样创作需求。跨平台使用,处理速度快,音质清晰接近录音室水准。注册即享免费积分,轻松开启音乐编辑之旅。
|
存储 Java
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
481 4
|
Oracle 关系型数据库 数据库
Oracle 简介与 Docker Compose部署
Oracle 数据库是一款由 Oracle 公司开发的关系型数据库管理系统(RDBMS)。它被广泛应用于企业级应用程序,提供了可靠的数据存储和强大的数据管理功能。
867 1
Oracle 简介与 Docker Compose部署
|
负载均衡 Java API
深入了解Feign——优雅的HTTP客户端
在现代的软件开发中,服务间的通信变得越来越重要。微服务架构的兴起使得应用程序的各个组件可以独立开发、部署和维护,从而提高了灵活性和可伸缩性。然而,微服务之间的通信也带来了一些挑战,例如如何管理不同服务之间的调用和数据传输。在这个领域,Feign作为一种优雅的HTTP客户端框架,为我们解决了许多通信相关的问题。
713 0
|
运维 监控 数据可视化
大白话详解Spring Cloud服务降级与熔断
Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。这就造成有可能会发生 服务雪崩 。那么什么是服务雪崩呢? 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“ 扇出 ”(像一把打开的折扇)。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的” 雪崩效应 “。也就是系统的 高可用 受到了破坏。

热门文章

最新文章