单例模式,顾名思义就是只有一个实例,并且它自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
所以单例模式的特点可以总结为:
- 单例类只能有一个实例
- 单例类必须自己创建自己唯一的实例
- 单例类必须给所有其他对象提供这一实例
单例模式的实现
- 饿汉式—静态常量方式(线程安全)
在类初始化时,已经自行实例化
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
- 懒汉式(线程不安全)
在第一次调用的时候实例化自己
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
- 懒汉式—加上同步锁(线程安全)
加上同步锁保证了多线程场景下的单例。
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
- 双重校验锁(线程安全,比同步锁效率高)
这种方式不用每次都获得锁,节省了获取锁和等待的时间。
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
- 静态内部类实现单例(线程安全、效率高)
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}