001.定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供
002.目的
使得类的一个对象成为该类系统中唯一实例
003.单例模式优缺点
- 优点
- 在内存中只有一个对象,节省内存空间
- 避免频繁的创建销毁对象,提供性能
- 避免对共享资源的多重占用
- 缺点
- 扩展比较困难
- 如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失
004.常见的写法
- 饿汉式
- 懒汉式
005.实现步骤
- 将构造函数私有化
- 在类的内部创建实例
- 提供获取唯一实例的方法
006.几种写法
- 饿汉式
- 线程安全、非懒加载、效率高
public class Singleton{
//将构造函数私有化
private Singleton(){}
//在类的内部创建实例
private static Singleton instance=new Singleton();
//提供获取唯一实例的方法
public static Singleton getInstanse(){
return instance;
}
}
- 懒汉式
- 线程不安全、懒加载、效率低
- 解决线程安全办法
- 1.同步锁、双重校验锁、静态内部类、枚举
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstanse(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
- 双重校验锁
- 线程安全、懒加载、效率高
public class Singleton(){
private static volatile Singleton singleton = null;
private Singleton() { }
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
- 静态内部类
- 线程安全、懒加载、效率高
publi class Singleton(){
private Singleton(){ }
private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}
007.饿汉式和懒汉式比较
- 饿汉式在类加载时就创建实例,第一次加载速度快;
- 懒汉式第一次使用时才进行实例化,第一次加载速度慢;
- 饿汉式是空间换时间,而懒汉式是时间换空间;
- 饿汉式线程安全,懒汉式存在线程风险;
- 解决方案(1.同步锁、双重校验锁、静态内部类、枚举)
008.适用场景
- 需要频繁的进行创建和销毁的对象
- 创建对象时占用资源过多,但同时又需要用到该类对象
- 对系统内资源要求统一读写,如读写配置信息
参考资料:
- juejin.cn/post/684490… --单例模式你会几种写法?
- www.imooc.com/ --慕课网