目录
单例模式
我的理解:意思就是某个类的对象,在整个程序中只存在一个,可以理解为只能被new一次,然后所有人都只能用这个对象。像这样的确保只生成一个实例的模式被称为Singleton模式。
作为单例模式的类有几个特点:
- 构造方法私有。确保无法被new
- 有一个自身的静态成员对象
- 有一个获取这个单例对象的 静态成员方法getInstance()
比如一个最简单的例子
方式一:这里可以确保肯定是单例,因为new这个动作在类加载时就做好了。(也被称为饿汉式)
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("生成了一个实例。");
}
public static Singleton getInstance() {
return singleton;
}
}
方式二:这里可能会有问题,两个线程同时第一次调用getInstance方法时,可能会new两次。(也被称为懒汉式)
public class Singleton {
private static Singleton singleton;
private Singleton() {
System.out.println("生成了一个实例。");
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
方式三:双重检查锁定
public class Singleton {
// 1. 声明 volatile 关键字,确保可见性和禁止指令重排
private static volatile Singleton instance;
// 2. 私有构造方法,防止外部实例化
private Singleton() {}
// 3. 提供公共的静态方法,返回单例对象
public static Singleton getInstance() {
// 第一次检查:如果实例不存在,则进入同步块
if (instance == null) {
synchronized (Singleton.class) {
// 第二次检查:再次确认实例是否已经被其他线程创建
if (instance == null) {
// 实例化对象
instance = new Singleton();
}
}
}
return instance;
}
}