静态内部类单例

简介: 静态内部类单例

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项值,然后改路径。
3699 0
|
存储 Java
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质
366 4
|
JavaScript Shell Linux
Node.js中的express框架,修改内容后自动更新(免重启),express热更新
Node.js中的express框架,修改内容后自动更新(免重启),express热更新
|
负载均衡 Java API
深入了解Feign——优雅的HTTP客户端
在现代的软件开发中,服务间的通信变得越来越重要。微服务架构的兴起使得应用程序的各个组件可以独立开发、部署和维护,从而提高了灵活性和可伸缩性。然而,微服务之间的通信也带来了一些挑战,例如如何管理不同服务之间的调用和数据传输。在这个领域,Feign作为一种优雅的HTTP客户端框架,为我们解决了许多通信相关的问题。
595 0
|
运维 监控 数据可视化
大白话详解Spring Cloud服务降级与熔断
Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。这就造成有可能会发生 服务雪崩 。那么什么是服务雪崩呢? 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“ 扇出 ”(像一把打开的折扇)。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的” 雪崩效应 “。也就是系统的 高可用 受到了破坏。
|
存储 关系型数据库 MySQL
表设计的10条军规
本文主要介绍了数据库建表的18个小技巧,包括:名字的命名规范、字段类型的选取、字段长度的控制、外键的使用、索引的创建、主键的选择、字段个数的限制、存储引擎的选择、时间字段的处理、金额字段的保存、冗余字段的使用以及注释的添加。作者强调了命名的重要性,如使用小写字母、避免全大写、使用下划线分隔等,并提倡使用NOT NULL和默认值,合理选择字段类型如datetime、decimal等,以及避免使用过多的字段和索引。此外,还提到了字符集和排序规则的选择,以及大字段和冗余字段的处理。
399 1
|
存储 Java 编译器
JVM的五大内存区域
JVM内存区域最粗略的划分可以分为 堆 和 栈 ,当然,按照虚拟机规范
290 0
|
Android开发
Android中Glide加载Https图片失败的解决方案
Android中Glide加载Https图片失败的解决方案
849 1
|
Android开发
解决在Android Compose中点击空白处收回软键盘
解决在Android Compose中点击空白处收回软键盘
494 0
Springboot集成 Sharding-JDBC + Mybatis-Plus实现分库分表(源码)
Sharding-jdbc是开源的数据库操作中间件;定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。