单例模式很好理解,就比如一夫一妻制,当老公叫老婆的时候,肯定是指那个唯一的女生(特殊情况例外....),下面我用一种趣解的方式来讲解单例模式的基础版:懒汉式、饿汉式。
懒汉式:男生小时候很懒,没有找青梅竹马定亲。那么长大了,家里人得找男生要老婆啊,怎么办呢,结婚!(逼婚),但是有个问题,男生得去找老婆,形形色色的世界,难免会有第三者插手,所以需要一点手段保证只找到一个老婆(线程不安全)。
java代码如下:
/**
* 懒汉式模式:在类加载时不初始化,当需要时再反馈(延迟加载)
*/
public class Husband01 {
//这句话看起来很奇怪,就理解为一开始每个男人都是没有老婆的
private static Husband01 wife = null;
//私有化老公,让小三无法拥有
private Husband01(){}
//当家里人找你要老婆的时候
public static synchronized Husband01 getWife(){//添加synchronized防止小三插入问题
if(wife == null){
wife = new Husband01();//这句话理解成老公和老婆结婚啦!
}
return wife;
}
}
饿汉式:男生很饥渴,一生下来就找到青梅竹马并订了娃娃亲,既然订了娃娃亲,如果家里找男生要老婆,肯定告诉他们定的娃娃亲那个老婆啦。当然,既然订了娃娃亲,男生已经有了老婆,那么就不会去找小三,不用担心安全问题咯(线程安全)。
java代码如下
/**
* 饿汉式,在类加载时不初始化,不可延时加载,天生线程安全。
*
*/
public class Husband02 {
//一样看起来是个奇怪的语句,理解成每个男人在生下来就被家人订了娃娃亲
private static Husband02 wifi = new Husband02();
//私有老公,让小三无法拥有
private Husband02(){}
//当家里人找你要老婆的时候;既然订了娃娃亲,就不用加synchronized防止小三插入
public static Husband02 getInstance(){
return wifi;
}
}
一、至于懒汉式为什么线程不安全?
很简单理解,如果两个女生同时来找男生领证结婚,那么他们两个都不违背重婚罪(因为男生在和她领证之前没有和其他人领证)。
二、懒汉式和饿汉式的效率?
想想就知道,肯定是定娃娃亲(饿汉式)效率高啊!
三、各自的优缺点?
饿汉式:不用担心出轨(线程安全),但是男生从小就要开始花两份钱(浪费资源)。
懒汉式:可能会出轨(线程不安全,可避免,但是会导致效率低),但是男生在结婚之前只用花一个人的钱(节约资源)。
既然有各自的优缺点,那么,能不能综合两者的优势呢?请看下一讲单例模式加强版