精心整理了设计模式——单例模式,包括代码解释方便理解,但是难免不了存在纰漏,感谢大家的指正与理解!觉的写的不错的小伙伴儿,一键三连支持一下,后期会有持续更新!!抱拳了罒ω罒
1. 单例模式简介
- 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 常见的使用场景:线程池,数据库连接池、网站计数器、Spring容器默认Bean
- 构建方式:饿汉式,懒汉式,内部类(重点)
不管是哪一种实现方式,单例类的构造函数必须是私有的;instance 成员变量和方法必须是 static 的。
2. 饿汉式
指全局的单例实例在类装载时构建,因此不需要考虑线程安全问题
class HungrySingleton{
//类加载是就直接实例化对象。
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return instance;
}
}
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
3. 懒汉式(非线程安全)
指全局的单例实例在第一次被使用时构建。
class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){}
//没有加入synchronized关键字的版本是线程不安全的
public static LazySingleton getInstance(){
if (instance == null)
instance = new LazySingleton();
return instance;
}
}
4. 懒汉式(双重检查加锁版本)
class LazySingleton{
// 添加volatile 关键字,内存模型中出现指令重排现象
private volatile static LazySingleton instance;
private LazySingleton(){}
public static LazySingleton getInstance(){
if (instance == null)
//给代码块加锁,而不是给整个方法加锁,提高性能,降低开销
synchronized (LazySingleton.class){
if (instance == null)
instance = new LazySingleton();
}
return instance;
}
}
5. 静态内部类单例模式(推荐)
该方法集成的饿汉式和懒汉式的优点,既延时加载又线程安全,还不需要synchronized 锁。
外部类加载时不需要加载静态内部类,不被加载则不占用内存(延迟加载),当外部类调用getInstance方法时,才加载静态内部类,静态属性保证了全局唯一,静态变量初始化保证了线程安全
class InnerClassSingleton{
//内部类
private static class InnerClassHolder{
private static final InnerClassSingleton instance = new InnerClassSingleton();
}
private InnerClassSingleton(){}
public static InnerClassSingleton getInstance(){
return InnerClassHolder.instance;
}
}