Java23种设计模式之 [单例模式]
1. 饿汉式和懒汉式的优缺点?
饿汉式
优点:对象提前创建好了,使用的时候无需等待,效率高;
缺点:对象提前创建,会占据一定的空间,内存占用大;
以空间换时间。
懒汉式
优点:对象用的时候再创建,不会提前占用空间,占用内存小;
缺点:首次使用对象的时候要等待对象创建,而且每次使用的时候都要判断对象是否为null,效率低;
以时间换空间。
因为饿汉式单例效率高,实现简单,推荐使用饿汉式。
2. 代码
单例设计模式
三个要求:
(1)确保一个类只有一个实例:构造方法私有
(2)可以自行实例化:该实例是类成员变量,用static修饰
(3)并向整个系统提供这一实例:提供公共的get方法
public class SingleTon {
// 1. 饿汉式
/*
private static SingleTon singleTon = new SingleTon();
private SingleTon(){}
public SingleTon getSingleTon(){
return singleTon;
}
*/
// 2. 懒汉式
/*加volatile的原因:singleTon = new SingleTon()创建过程可分为三步:
(1)分配内存
(2)执行构造方法,初始化对象
(3)把该对象指向刚分配的地址(此时singleTon!=null)
若发生重排序,假设A线程执行了1和3,还没来得及执行2,
此时B线程来到判断,发现singleTon!=null,B线程就会直接返回还没初始化的实例,
volatile可以避免重排序
*/
private volatile static SingleTon singleTon;
private SingleTon(){}
public SingleTon getSingleTon(){
/*
第一层 if (instance == null)是为了减少线程对同步锁锁的竞争,提高效率,第二层if(instance==nul)是保证单例。
*/
if(singleTon == null){
synchronized (SingleTon.class){
if(singleTon == null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}