有时候有一些只允许有一个实例的类需要用单例模式实现
- 单例模式可以分为
- 饿汉(很饥渴,有就吃,类加载时就创建对象)
- 饱汉(不饥渴,饿了再吃,用到类实例时才创建对象)
- 双重锁模式
/**
* 单例模式 饿汉模式
* Created by wjj on 2021/1/3
*/
public class Singleton {
private Singleton(){}
private static Singleton instance=new Singleton();//类加载时就创建实例
public static Singleton getInstance() {
return instance;
}
}
/**
* 懒汉模式
* Created by wjj on 2021/1/3
*/
public class Singleton2 {
private Singleton2() {
}
private static Singleton2 instance;
public static Singleton2 getInstance() {//先判断有木有实例,没有在实例化
if(instance==null)
instance=new Singleton2();
return instance;
}
}
- 懒汉与饿汉的比较
- 体现在加载时间上不同:饿汉模式在类加载时就建对象,所以加载时比较慢,获取对象比较快;相反,懒汉模式在类加载时比较快,但是获取对象时比较慢
- 体现在线程安全问题上:饿汉模式在类加载时建对象,所以是线程安全的,但是懒汉模式在并发时会造成线程不安全
为了解决以上问题,我们可以引出第三种单例模式
3.双重锁模式
//在包含
public class Singleton3 {
public Singleton3() {
}
private static Singleton3 instance;
public static Singleton3 getInstance() {
if(instance==null){
synchronized (Singleton.class){//通过加锁解决线程安全问题
if(instance==null)
instance=new Singleton3();
}
}
return instance;
}
}
饱汉模式的基础上加入了锁机制,解决了线程不安全的问题