【设计模式】单例模式
定义
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
适用场景
- 类中的方法是与状态无关的,且需要控制实例数目,节省系统资源
- 常用于数据库连接池、日志对象、缓存等
单例模式的实现方式
1、使用spring的bean容器管理进行创建,创建的实例默认都是单例,且线程安全。(推荐)
2、懒汉式-非线程安全(不推荐)
优点:实现方便,延迟初始化,只有在使用时才会初始化
缺点:线程不安全,多线程访问下会有问题
public class Singleton {
private Singleton(){}
private static Singleton singleton ;
public static Singleton getInstance(){
if (singleton == null)
singleton = new Singleton();
return singleton;
}
}
3、懒汉式-线程安全(不推荐)
优点:实现方便,延迟初始化,线程安全
缺点:利用synchronized关键字保证线程安全,每次访问都会加锁,如果访问频率过高会影响性能
public class Singleton {
private Singleton(){}
private static Singleton singleton ;
public static synchronized Singleton getInstance(){
if (singleton == null)
singleton = new Singleton();
return singleton;
}
}
4、懒汉式-双重检验-线程安全(推荐)
优点:实现方便,延迟初始化,线程安全且多线程下也能保证性能
public class Singleton {
private Singleton(){}
private volatile static Singleton singleton;
public static Singleton getInstance(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
5、饿汉式-线程安全(推荐)
优点:实现方便,线程安全
缺点:如果对象不被使用会浪费内存
public class Singleton {
private Singleton(){}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
6、静态内部类-线程安全(推荐)
优点:实现方便,延迟初始化,利用类加载保证了线程安全,多线程下也能保证性能
public class Singleton {
private Singleton(){}
private static class SingleInnerClass{
private static final Singleton SINGLE = new Singleton();
}
public static final Singleton getInstance(){
return SingleInnerClass.SINGLE;
}
}
一般情况下推荐使用1,5,如果明确表示需要延迟加载则推荐6,4

浙公网安备 33010602011771号