单例模式很好理解,就比如一夫一妻制,当老公叫老婆的时候,肯定是指那个唯一的女生(特殊情况例外....),下面我用一种趣解的方式来讲解单例模式的基础版:懒汉式、饿汉式。
懒汉式:男生小时候很懒,没有找青梅竹马定亲。那么长大了,家里人得找男生要老婆啊,怎么办呢,结婚!(逼婚),但是有个问题,男生得去找老婆,形形色色的世界,难免会有第三者插手,所以需要一点手段保证只找到一个老婆(线程不安全)。
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; } }一、至于懒汉式为什么线程不安全?
很简单理解,如果两个女生同时来找男生领证结婚,那么他们两个都不违背重婚罪(因为男生在和她领证之前没有和其他人领证)。
二、懒汉式和饿汉式的效率?
想想就知道,肯定是定娃娃亲(饿汉式)效率高啊!
三、各自的优缺点?
饿汉式:不用担心出轨(线程安全),但是男生从小就要开始花两份钱(浪费资源)。
懒汉式:可能会出轨(线程不安全,可避免,但是会导致效率低),但是男生在结婚之前只用花一个人的钱(节约资源)。
既然有各自的优缺点,那么,能不能综合两者的优势呢?请看下一讲单例模式加强版