静态内部类单例

简介: 静态内部类单例

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项值,然后改路径。
3638 0
|
JavaScript Java Maven
理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies
理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies
5832 1
|
JavaScript Shell Linux
Node.js中的express框架,修改内容后自动更新(免重启),express热更新
Node.js中的express框架,修改内容后自动更新(免重启),express热更新
|
存储 关系型数据库 MySQL
表设计的10条军规
本文主要介绍了数据库建表的18个小技巧,包括:名字的命名规范、字段类型的选取、字段长度的控制、外键的使用、索引的创建、主键的选择、字段个数的限制、存储引擎的选择、时间字段的处理、金额字段的保存、冗余字段的使用以及注释的添加。作者强调了命名的重要性,如使用小写字母、避免全大写、使用下划线分隔等,并提倡使用NOT NULL和默认值,合理选择字段类型如datetime、decimal等,以及避免使用过多的字段和索引。此外,还提到了字符集和排序规则的选择,以及大字段和冗余字段的处理。
335 1
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:迁移学习与领域自适应教程
【7月更文挑战第3天】 使用Python实现深度学习模型:迁移学习与领域自适应教程
329 0
|
XML 物联网 API
Android Ble蓝牙App(二)连接与发现服务
Android Ble蓝牙App(二)连接与发现服务
552 1
|
Java Maven Android开发
android之gradle配置仓库与引入依赖
android之gradle配置仓库与引入依赖
921 0
|
存储 缓存 网络协议
淘宝HTTP3/QUIC技术演进与实践
淘宝HTTP3/QUIC技术演进与实践
1247 1
淘宝HTTP3/QUIC技术演进与实践
一元函数微分学中导数--高阶导数--极值--凹凸性--泰勒展开式
一元函数微分学中导数--高阶导数--极值--凹凸性--泰勒展开式
|
JavaScript 网络架构
Vue 安装 Vue-router 路由安装以及使用
Vue 安装 Vue-router 路由安装以及使用
542 0