单例模式
单例模式的注意点:
1. 单例类有且仅有一个实例
2. 实例对象由该单例类创建,对象的创建对外不可见
实现单例模式主要有几种方式:懒汉模式,饿汉模式,静态内部类方式,双重校验锁方式
懒汉模式1
- 直到调用getInstance方法才进行实例化
- 线程不安全
- 懒加载
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉模式2
- 直到调用getInstance方法才进行实例化
- 线程安全,但使用锁每次getInstance都需要获取锁
- 懒加载
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
双重校验锁
- 直到调用getInstance方法才进行实例化
- 线程安全,多线程下性能也不错
- 懒加载
public class Singleton {
private static volatile 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 = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
静态内部类
- 静态类变量instance加载时机晚于双重校验锁方式
- 只有通过显式调用 getInstance 方法时,才会显式装载 InstanceHolder 类,从而实例化 instance
- 优点:执行效率高,线程安全
public class Singleton {
private Singleton() {
}
public static final Singleton getInstance() {
return InstanceHolder.INSTANCE;
}
private static class InstanceHolder{
private static final Singleton INSTANCE = new Singleton();
}
}