一.啥是单例模式?
先介绍一下设计模式:
设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路. 按照套路来⾛局势就不会吃亏.
软件开发中也有很多常⻅的 "问题场景". 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这个套路来实现代码, 也不会吃亏.
单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例.
这种情况就存在了两份实例
单例模式具体的实现⽅式有很多. 最常⻅的是 "饿汉" 和 "懒汉" 两种
二.饿汉模式
实现步骤:
1.要实现单例模式,只需要定义一个静态全局变量,这样就可以保证变量全局唯一。
private static Singleton instance= new Singleton();
private:保证这个变量不可修改。
static:保证全局唯一
2.构造方法私有化
private Singleton() {
}
这样就保证了外界无法通过构造方法创建对象
3.将获取instance的方法用static修饰,使其可以通过类.方法名调用。
public static Singleton getInstance() {
return instance;
}
public class Singleton {
private static Singleton instance= new Singleton();
//构造方法私有化
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
这种在类加载时就完成初始化对象的模式称为"饿汉模式"。
三.懒汉模式
1.只声明全局变量,不初始化
private static Singleton_02 instance = null;
2.获取instance时进行if判断,为null再初始化
public static Singleton_02 getInstance() {
if(instance == null) {
instance = new Singleton_02();
}
return instance;
}
private static Singleton_02 instance = null;
private Singleton_02() {
}
public static Singleton_02 getInstance() {
if(instance == null) {
instance = new Singleton_02();
}
return instance;
}
这样创建在单线程运行没问题
但在多线程模式下:
这里暂停1s是为了让线程全部进入if语句
可能会出现问题
因此,要解决这个线程问题,使用新学的synchronized,volatile关键字
private static volatile Singleton_02 instance = null;
private Singleton_02() {
}
public static Singleton_02 getInstance() {
if(instance == null) {
synchronized(Singleton_02.class) {
if(instance == null) {
instance = new Singleton_02();
}
}
}
return instance;
}