主要给大家介绍两种模式
1. 饿汉模式
class Singleton{
// 饿汉模式
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
private Singleton() { }
}
线程安全,只有读操作,并没有改变
2. 懒汉模式
class SingletonLazy{
// 懒汉模式
volatile private static SingletonLazy instance = null;
public static SingletonLazy getInstance(){
// 这里判断是否加锁
if (instance == null) {
// 这里判断是否实例化
synchronized (SingletonLazy.class) {
if(instance == null){
instance = new SingletonLazy();
}
}
}
return instance;
}
private SingletonLazy(){ }
}
举个🌰,帮大家理解
假设我们要打开一个文件(很大,10G)
饿汉 : 全部打开,卡很久
懒汉 : 只打开一部分,占据一个屏幕,翻页后,继续打开后面的部分,不会让内存卡住
总结 :
饿汉模式 : 线程安全,只有读操作
懒汉模式 线程不安全,有读有写
1. 我们要进行加锁,保证操作原子性
2. 双重 if 判断,减少多余加锁操作
3. 使用 volatile 禁止指令重排序