单例模式指一个类只有一个实例,以节省资源。
创建单例模式的主要步骤:
- 私有构造方法
- 创建一个私有的、静态的实例
- 创建共有的、静态的方法,返回实例
饿汉模式
//饿汉模式
public Class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
饿汉模式的特点为线程安全,较为常用,但由于对象一开始就进行了实例化,没有延时加载,容易产生垃圾。
懒汉模式
//懒汉模式
public Class Singleton {
private Singleton(){}
private static Singleton instance;
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
懒汉模式的特点为线程不安全,但实现了延时加载,不会浪费资源。
双重锁模式
//双重锁模式
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;
}
}
双重锁机制的特点为线程安全,延迟加载,使用volatile修饰了实例化变量,在多线程的情况下保证了高性能。
静态内部类模式
//静态内部类模式
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return Inner.instance;
}
private static class Inner {
private static final Singleton instance = new Singleton();
}
}
静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。