单例模式中的静态变量技巧
创作时间:
作者:
@小白创作中心
单例模式中的静态变量技巧
引用
CSDN
等
7
来源
1.
https://blog.csdn.net/qq_45583132/article/details/139174920
2.
https://blog.csdn.net/qq_42817360/article/details/136878388
3.
https://blog.csdn.net/m0_74173529/article/details/137357642
4.
https://blog.csdn.net/XindaBlack/article/details/140238341
5.
https://www.cnblogs.com/nolca/p/18232734
6.
https://cloud.tencent.com/developer/article/2443358
7.
https://www.cnblogs.com/rthete/p/18056789
在Java开发中,单例模式是一种常见的设计模式,用于保证一个类只有一个实例,并提供一个全局访问点。静态变量在这个过程中扮演重要角色,它们存储唯一的实例引用,从而实现全局访问和控制。了解静态变量的使用场景和注意事项对于掌握单例模式至关重要。本文将详细介绍如何利用静态变量实现高效的单例模式,以及在实际应用中需要注意的关键点。
01
单例模式与静态变量的关系
单例模式的核心是确保一个类只有一个实例,并提供一个全局访问点。静态变量是实现这一目标的关键,因为它们在类加载时被初始化,并在整个类的生命周期内保持不变。所有实例共享同一个静态变量,这使得我们可以通过静态变量来存储唯一的实例引用。
02
单例模式的实现方式
饿汉式
饿汉式是在类加载的时候就实例化对象,由于JVM只会加载类一次,因此保证了线程安全。
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {} // 私有化构造器,防止外部访问到
public static Singleton getInstance() {
return instance;
}
}
优点:实现简单,线程安全。
缺点:可能造成资源浪费,因为实例在类加载时就创建了,即使后续可能根本不会用到。
懒汉式
懒汉式是在需要的时候才创建对象,但需要解决线程安全问题。
class Singleton {
private static volatile Singleton instance;
private Singleton() {} // 私有化构造器,防止外部访问到
public static Singleton getInstance() {
if (instance == null) { // 过滤,提高性能
synchronized (Singleton.class) {
if (instance == null) { // 防止多线程下的线程安全问题
instance = new Singleton();
}
}
}
return instance;
}
}
要点:
- 为什么要加volatile关键字?防止指令重排带来的影响。
- 为什么需要两次if判断?第一次判断避免不必要的同步开销,第二次判断确保线程安全。
静态内部类
静态内部类方式结合了饿汉式和懒汉式的优点。
class Singleton {
private Singleton() {} // 私有化构造器,防止外部访问到
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
原理:
- 利用JVM的类加载机制保证线程安全
- 实现懒加载,只有在第一次调用getInstance()时才会加载内部类
- 避免了同步带来的性能开销
03
线程安全问题
在多线程环境下,单例模式需要特别注意线程安全问题。以懒汉式为例,如果多个线程同时调用getInstance()方法,可能会创建多个实例,违反单例原则。
解决方案:
- 使用volatile关键字:防止指令重排,确保instance的可见性和原子性。
- 双重检查锁定(Double-Checked Locking):在getInstance()方法中使用两次if判断,既保证线程安全又提高性能。
- 静态内部类:利用JVM的类加载机制天然支持线程安全。
04
最佳实践
- 选择合适的实现方式:如果实例创建成本不高,可以选择饿汉式;如果需要延迟加载,建议使用静态内部类。
- 注意线程安全:在多线程环境下,务必使用volatile关键字和双重检查锁定模式。
- 防止反射攻击:将构造器声明为private,防止外部通过反射创建新实例。
- 考虑序列化问题:如果单例类需要序列化,需要实现readResolve()方法,防止反序列化时创建新实例。
通过合理使用静态变量和遵循最佳实践,我们可以实现高效、安全的单例模式,为系统提供稳定的全局访问点。
热门推荐
云梦睡虎地秦简:一位秦代基层公务员留下的法治密码
全自动做菜机器人应用领域
探寻燕窝替代品:全面解析各类天然滋补食材及其功效
2025年必玩智力游戏TOP10:解谜、经营、连线全都有
哈佛斯坦福留学费用揭秘:你真的算清楚了吗?
赴美留学必备:Student Secure保险计划
College Board权威指南:赴美留学费用规划
哈佛和MIT留学费用揭秘:真的那么贵?
拉布拉多如何训练
养拉布拉多犬的注意事项:如何在家中饲养健康快乐的拉布拉多犬
红霉素:抗菌谱广,使用不当易致耐药
长江三峡:人民币上的壮丽景观与文化传承
第五套人民币:中国经济发展的见证者
5元人民币荷花图案:传统文化的现代诠释
离婚财务处理:财产、债务、税务一文详解
降低离婚诉讼成本:从诉求到调解的全流程指南
离婚诉讼指南:6步程序+4大策略+心理调适全攻略
保山市与芒市之间的距离计算,以及可能的交通方式和时间
从《烟火》到《黑暗侦探》:十款精品灵异游戏推荐
第四套人民币上的她们:黄其萍与苏春熙的故事
第四套人民币收藏热持续升温:价格暴涨背后的投资价值
同仁堂燕窝:如何挑选高品质燕窝?
发现肺结节,该如何科学治疗?这里总结全了!
肺结节处理个体化决策
虹桥:《清明上河图密码》里的剧情与历史交汇点
从漕运到街市:清明上河图里的汴京百态
《清明上河图》里的宋代市井:商业繁荣与街头艺术
云南保山到芒市旅游路线攻略:怎么走?多远?要多长时间?
新交规出台后,高速开到144也没事了?别被误导了
银行卡异地补办指南:多家银行支持,流程详解