java单例模式饿汉式与懒汉式
本篇文章写给刚接触java相关工作的萌新,内容较浅易懂,深入的东西本人也在持续学习中,有错误还请多多指教~
java的单例模式以及里面的饿汉式懒汉式几乎是java相关职业必考的面试题,其实这两个东西看上去很简单也确实很简单,与其去记代码不如理解原理,理解之后闭着眼睛都能写出来。
饿汉式
光看名字,既然是饿汉,那就是饥不择食,怎样体现饥不择食呢?就是在初始化这个饿汉式单例类的时候,它自身就已经实例化了。可能有些绕口,大家有点java基础的话应该都能理解初始化一个类之后,一直到使用到这个类之前,这段时间里,这个“饿汉”因为太饿了,在初始化的时候就在自身内部把自己实例化好了,当你要使用的时候就直接拿无需再实例化。
换言之就是一种典型的空间换时间的思想。
//饿汉式单例类.在类初始化时,已经在自身内部实例化
public class Singleton {
private Singleton() {};
private static final Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
懒汉式
理解了饿汉式再来理解懒汉式就很好理解了,懒汉式与饿汉式恰恰相反,在初始化这个懒汉式单例类之后一直到使用它之前的这段时间里,这个“懒汉”因为太懒了,不到最后关头就不想“动”,也就是说初始化之后只有在使用它的时候它才会实例化。
换言之就是一种典型的时间换空间的思想。
//懒汉式单例类.在第一次调用的时候才会实例化自己
public class Singleton {
private Singleton() {};
private static Singleton singleton = null;
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton ;
}
}
最后不论是饿汉还是懒汉,构造方法一定是用private去限制的,不然也无法达到饿汉或者懒汉的效果了。