单例模式中的静态变量技巧
创作时间:
作者:
@小白创作中心
单例模式中的静态变量技巧
引用
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()方法,防止反序列化时创建新实例。
通过合理使用静态变量和遵循最佳实践,我们可以实现高效、安全的单例模式,为系统提供稳定的全局访问点。
热门推荐
选择和购买制氧机,应该考虑哪些方面?
985、211毕业生"反向升学"读技校,找到更高薪的工作了吗?
“进淄复烤”又热 美食“走红”促城市发展“长红”
电动汽车充电技术创新方向与未来挑战展望
快充和慢充有何区别?这份科普指南请收好!
诡异的量子世界,电子其实也是波?
什么是吕才合婚法
如何搭乘曼谷轻轨BTS/地铁MRT,换乘站点是哪个?应该购买单程还是一日票?
诺奖专家邀请|凯文·凯利:从亚洲游历到科技预言家的非凡旅程
生肖旺夫女:龙、鸡、猪、兔,相伴一生!
新法规下化妆品行业现状:机遇与挑战并存
吃完饭后就想大便?原因及预防方法全解析
指甲长白点是缺钙、长竖纹是神经衰弱?真相是......
工作站运算速度与频率的关系问题
一文读懂:什么是“算力”?
很多人失恋会不停的骚扰纠缠对方,这是种什么心理?
巴学园优缺点
混合云构建:Azure 双活VPN 连接 AWS 云的高可用架构详解
你得分清急性牙髓炎三个时期,包括牙髓炎初期症状/晚期不治的后果都有介绍!
探索长城:历史、文化与自然的完美交融之旅
警惕涉外婚姻诈骗,切莫人财两空
移动卡流量套餐升级攻略:告别流量不够用的烦恼
跨境电商物流:趋势与挑战
国内首个猕猴桃压差预冷催熟装置研发成功,助力即食猕猴桃发展
如何除螨虫床上和身上
如何正确看待户型图的朝向问题?这种看法对居住体验有何影响?
消费者权益保护:退费申请的法律依据
正月初六放鞭炮是什么意思 大年初六马日送穷神
扫黄打非知识科普
本田CR-V排气管滴水是怎么回事?