单例模式中的静态变量技巧
创作时间:
作者:
@小白创作中心
单例模式中的静态变量技巧
引用
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()方法,防止反序列化时创建新实例。
通过合理使用静态变量和遵循最佳实践,我们可以实现高效、安全的单例模式,为系统提供稳定的全局访问点。
热门推荐
工作中抱怨情绪太多怎么办呢
模因:文化传播的新动力与复杂面貌
家里空间小如太压抑?这7种显大、显高级的装修技巧,值得收藏
传统之“枣”文化
2024年国庆节前,社保和养老金迎来新动态,关系在职和退休人员
如何选择贷款还款方式
无偿献血者,进一步激励奖励!
江湖小技巧大公开:掌握这些你也是高手
股东向公司借钱的税务指南
脑肿瘤术后如何进行复查?
手指尖和脚趾尖麻木的原因是什么
2025年江西公务员申论高分例文解析<1·24>
马桶黄垢怎么清理?快速清洗马桶黄垢的技巧!
电磁炉工作原理详解:从电磁感应到电路设计
了解发质类型:选择适合你的洗护产品
纯实木地板耐磨吗?家居保养小窍门
100頁要看多久?——提升閱讀效率的全方位指南
预测模型是什么
2025年债券市场投资指南:机遇、风险与策略
征地补偿费用信息公开吗?详解征地补偿款发放与受益人群
苹果手机更新软件提示“无法联系iPhone软件更新服务器”的解决方法
息肉反复发作?不想总被“割”,中医防治息肉复发有方法
参松养心胶囊说明书:成分、功效与注意事项详解
浅谈各行业中脂肪酶的作用
张本智和父母:祖籍四川却全家归化日本,是为了前程,另有所图?
什么是MPV?多用途汽车的全面解析
生物学中的四大数学模型:从稳态到生长的理论框架
低剂量维生素E也能治疗脂肪肝?中国研究证实,有效且更安全
过期的碘伏能不能用
普法小课堂——公司强制清算案件全流程工作指引