设计模式之单例模式(笔记)
单例模式特点
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给其他所有对象提供这一个实例
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问方法
主要解决
一个全局使用的类频繁创建和销毁
何时使用
当你想要控制实例对象数目,节约系统资源的时候
懒汉式:线程不安全的
懒加载,线程不安全
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
懒汉式:线程安全的
懒加载,线程安全,多线程情况下影响性能
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
饿汉式
非懒加载,线程安全,但是容易产生垃圾对象
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
双锁校验
懒加载,线程安全,多线程情况下依然保持高性能,需要volatile保持可见性
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance==null) {
synchronized(Singleton.class) {
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
静态内部类
懒加载,线程安全,适用于静态域
public class Singleton {
private static Singleton instance;
private static class SingletonHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}