1.简介:
- 单例设计模式就是某个类在整个系统中只有一个实例对象可被获取和使用的代码模式。
1.1特点:
- 类构造器私有
- 某个类只有一个实例
- 含有一个该类的静态变量来保存这个唯一的实例
- 必须自行创建这个实例
- 对外提供获取实例的方式
- 必须自行向整个系统提供这个实例
- 直接暴露
- 用静态变量的get方法获取
- 必须自行向整个系统提供这个实例
2.饿汉模式
- 直接创建对象,不存在线程安全问题
- 直接实例化饿汉式(简介直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
2.1饿汉式实现
- 方式一:直接创建实例对象
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton (){}
}
- 方式二:枚举类型,表示该类型的对象是有限的几个,限定为一个就成了单例
public enum Singleton {
INSTANCE
}
- 方式三:静态代码块
public class Singleton {
public static final Singleton INSTANCE;
static{
INSTANCE = new Singleton();
}
private Singleton (){}
}
3.懒汉模式
- 延迟创建对象
- 线程不安全(适用于单线程)
- 线程安全(适用于多线程)
- 静态内部类形式(适用于多线程)
3.1 懒汉模式实现
- 方式一:线程不安全
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 方式二:同步方法,线程安全
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 方式三:同步代码块,线程安全
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
synchronized(Singleton.class){
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
- 方式四:静态内部类,线程安全
- 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。在内部类被加载和初始化时,才创建INSTANCE实例,因此线程是安全的。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 方式五:双重校验锁
public class Singleton {
private volatile static Singleton instance;
private Singleton (){}
public static Singleton getSingleton() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}