关于设计模式,这其实是单独存在的东西,它不属于 Java,也不属于任何语言所独有,但是在 Java 中使用较多,所以今天小编就给大家介绍下单例设计模式中的饿汉和懒汉这俩朴素的打工人。推荐好课:Java 多线程讲解、深入解析 Java 面向对象。
首先,我们先了解下单例模式的定义:单例设计模式目的是使得类的一个对象成为系统中的唯一实例。
再看下,Java 中单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
那么,所谓“懒汉式”与“饿汉式”的区别,是在于建立单例对象的时间不同。
“懒汉式”:是在你真正用到的时候才去建这个单例对象;
“饿汉式”:在不管你用的用不上,一开始就建立这个单例对象。
一、饿汉式
饿汉式:通俗的来讲,这位打工人对干饭特积极,不管饿不饿都跟饿死鬼似的,老早的就把干饭工具准备好了( new 对象),随时准备干饭。
上代码:
class Hungry_people{
private int id;
private String name;
private Hungry_people(){
} //构造器私有化
private static Hungry_people Instance=new Hungry_people();
//内部创建类的对象
public static Hungry_people getInstance(){
return Instance;
}
//提供公共的静态方法,且返回对象。
}
public class Test1 {
public static void main(String[] args) {
Hungry_people hungry1 = Hungry_people.getInstance();
Hungry_people hungry2 = Hungry_people.getInstance();
}
}
二、懒汉式
懒汉式:通俗的讲,这位打工人对干饭一点都不上心,碗筷脏了也不理,啥时候要干饭了才来洗碗筷( new 对象)。
上代码:
class Lazy_people {
private Lazy_people(){
}
private static Lazy_people Instance = null;
//声明当前对象没有初始化值
public static Lazy_people getInstance(){
if (Instance == null){
Instance=new Lazy_people ();
//需要再造对象,不要就不new对象了
}
return Instance;
}
}
public class Test2 {
public static void main(String[] args) {
Lazy_people lazy1 = Lazy_people.getInstance();
}
}
三、饿汉和懒汉有啥不同
对于饿汉式:
优点:线程贼安全
缺点:对象加载时间过长
对于懒汉式:
优点:延迟对象的创建,更快
缺点:多线程安全贼低,但是可以通过优化使其可用。
四、常见面试题
1.懒汉式和饿汉式有什么不同?
答:懒汉式的特点在于实例的延迟加载。
2.懒汉式的延迟加载有没有问题?
答:遇到多线程访问时会出现安全问题。
3.如何解决该问题?
答:可以增加同步来解决。
4.增加同步的方式?
答:用同步方法或同步代码块都可以,但是同步方法稍微有点低效。
5.增加同步时,使用的锁是哪一个?
答:该类所属的字节码文件对象。