简介
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
单例模式具备如下几个特点:
-
1、只有一个实例。
-
2、能够自我实例化。
-
3、提供全局访问点
优点
单例模式的主要优点就是节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。也许就是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有抽象类,所以扩展起来有一定的困难。
注意
单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)
1.饿汉模式
优点:线程安全
缺点:浪费内存空间
// 饿汉式单例
public class Singleton {
private Singleton(){}
private static Singleton singleton = new Singleton();
// 静态工厂方法
public static Singleton getInstance(){
return singleton;
}
}
2.懒汉模式
优点:延迟加载
缺点:不加同步的懒汉模式是线程不安全的,加了synchronized之后就变成线程安全的了
public class Singleton {
private Singleton() {
}
private static Singleton singleton = null;
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
3.双重检查加锁模式(推荐使用)
优点:性能又保证线程安全
public class Singleton {
private Singleton() {}
private static volatile Singleton singleton ;
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class){
if (singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}