00:00
如何实现,这是第二个,然后第三个呢,叫区分,区分饿汉式和懒汉式,行,那我们分别来提一下这两个有什么特点,懒汉式,恶汉式,那么大家目前呢,你先想一想,鄂汉式和览是如果大家去写,你倾向于写哪个,或者说你认为哪个好,说哪个的都有,这就看大家这个生活习惯了是吧,做事你要是喜欢拖拖拉拉的那种,就说,那我就跟他挺像,有共鸣感是吧?嗯,哪个好一点,我刚说完这个,大家说那我可不是这个懒的,我是属于饿的这种是吧,上来把事就都做完,嗯,但是在我们这个程序角度来讲的话呢,这两个来看,实际上懒案是呢要好一点,为什么呀?
01:00
对,就是它呢,相当于叫什么呀,我们叫延迟去创建对象,就是这个懒函式的话,呃,欧汉式的话呢,就上来就把这个对象就造好了,但有可能我现在不用,那它会在生命这个这个这个内存当中会加载很长的时间,这时候相当于占用内存呢,而对于这个懒汉式的话呢,一开始的时候,这个我就先不给你加载,当你不得不需要的时候呢,我帮你创建一下。就跟说准备中午这个分享一样,我提前五天就准备好,就这隔了五天太浪费了是吧,只剩这么个情况了啊,那我就哎不得不上的时候,前一秒这时候我才给你准备好,这个时候呢,是不是就节省大脑容量是吧,节省内存空间是吧,就成这样了啊从这个角度来讲呢,这是好的啊,所以这个懒汉式的话呢,相当于它的一个好处呢,这个叫啊延迟对象的一个创建,哎,相较于这个饿汉式来讲呢,应该算是一个好处,而我们这个呃,鄂汉式的话呢,它这算是它的一个坏处了。
02:06
其实也谈不上说是一个坏处,只是说相较于这个懒汉式来讲呢,不太好的一个点就是在一开始的时候呢,我们就把这个对象呢,就造好了,导致呢,我们这个对象它的一个加载时间过长,过长,呃,过长,实际上这个问题的话呢,也间接的就反映出来我们关于TE这个关键字的一个问题了,TE这个关键字的好处呢,就是说我们内存中只加载一份,然后呢,大家随时用的时候呢,诶立马就有,本身就提前都已经有了,这个因为提前已经有了,你用的时候直接拿过来用,这个效率上还挺快,但是它的弊端呢,就是生命周期过长,那你这个在内存中呢,就自始至终都存在,只有当我们这个类被清掉的时候呢,你这个静态的结构才会被清掉,就是这个结构呢,它就有利有弊,那么在恶汉式这块呢,体现的就是说这个弊端了,那一上来呢,就加载了,可能此时不用,导致呢,就加载的时间呢,可能过长。
03:07
这一个坏处,一个好处,从这一点出发呢,我们要考虑呢,优先用懒汉湿,那要是从另外一个角度来讲的话呢,这个我们又得考虑用这个鄂汉式的,这里边儿就提到另外一个事情,就是这个鄂汉式呢,它是一个线程安全的,嗯。这是它的一个好处,说恶汉市它天然就是一个现场安全的,现场安全这个词呢,我们还没有提过,等我们讲到后边Java基础高级的时候呢,讲多线程,就会讲线程安全的问题,这个简单说一下,什么叫安全问题呢?就是比如说咱们有一个银行的账户,这个账户呢,我有5000块钱,然后呢,我现在有两个线程,这个线程的话我去取钱,我去取钱呢,我想取多少,我就想取这5000块钱,然后这个县程的话呢,我也想去取这5000块钱,有可能你呢,是通过你的这个,比如支付宝取的,然后这个呢,比如是你媳妇儿通过这个银行卡去取的。
04:08
那正常来讲的话呢,这5000块钱就只能取一份,但是事实情况呢,假设你这周去取了,你一去取,首先呢,你得判断一下这个银行账户呢,够不够5000,这个先得有个依附语句,这个依附语句呢,一判断说够够,然后呢,你下边就开始要去把这个钱取出来,在刚判断完够还没有取的时候呢,这时候呢,程序就停到这儿了,就在这么0.000001这个秒的时候呢,你媳妇这个进来了,这个概率可能有点低是吧,但是你禁不住这我只是以两个人举例,你禁不住说这个访问的这个并发性高啊,比如大家去网上买票的时候,都想买这一张票,可能网上这个几十万人就抢这一张票,这个时候呢,你这个概率虽然概率很低,但是人数一大的时候呢,一乘出来可能就会出现这样的问题了,所以我们肯定要避免这样的情况出现啊,那我们现在就说这个情况,在你刚判断完这个事儿是个处的时候呢,刚一进去还没有让你这个账户呢,减去这个钱,你把钱拿出来的时候呢,这时候呢,你媳妇呢。
05:08
啊,一判断他从银行卡去取,一取发现也够5000块钱,他相当于是不是也进到这个衣服里了,相当于你俩现在都满足,这个是出的情况,那接下来会出现什么情况呢?你把这5000拿走了,挺happy,然后呢,你媳妇也拿走了,挺happy,银行苦了,说你这个卡这怎成了,这个成了信用卡完成了是吧?啊,而且还没有信用的这个额度啊,相当于白白的就多取了5000块钱,把这种事呢,我们就叫做现成的安全问题啊,叫安全问题,再换个例子呢,就好比大家去这个春运的时候抢票一样,就就这一张票,这张票呢,这个号呢,就是21号,那这个人呢,抢走了,然后呢,结果呢,比如说他他判断这有没有这个票的时候,他就判断这个人没有人买这个票,没人买,然后刚判断进入这个逻辑票还没出来的时候,别人也进去了,别人一判断这个票号也没人买,也可能不止一个,三个人呢,都把这个21号这个票买了,最后坐火车的时候呢,三个人就得坐一起了,因为都是真票。
06:08
落日落对吧,啊,就都是真票没有假票,像这种呢,这也都叫现成安全问题,那么咱们说呀,咱现在写的这个饿汉式呢,它天然就是一个安全的,而对于我们这个懒汉式呢,目前的这种写法,它是一个不安全的,目前的这个写法它的一个坏处。这个坏处呢,就是线程不安全,就是咱们现在写的这个恶函式不安全,怎么叫不安全了,我简单的说一下好,我现在呢有两个线程,这两个线程呢,我都想去获取一下,你当前这个类的对象,都想获取这个对象,那这个对象呢,就这一个,应该是大家拿走的是同一个地址,好现在我第一个线程一进来以后,我们此时呢,是首次掉,首次调的时候呢,Incent就是no,我是不是就进去了,进去以后呢,这时候没有马上去new,这时候呢,稍微停了一下,你可以理解为这个线程呢,阻塞了一下,然后就在这个阻塞这个时间之内呢,我这个线程也进来了,我一进来的话呢,是不是此时还是个闹,所以我也进去了,接着的话呢,他俩就分别的扭了一下,走了,这个也扭了一下,走了,这俩是不是就各自扭了个对象了?这就叫县城不安全了。
07:31
嗯。就是咱们目前这种写法呢,是一个线程不安全的,但如果大家开发中要是用的时候涉及到多线程的问题了,那么还得对它进行一个修改,那怎么改呢?这个我们说放到多线程的时候,我们再把它改成一个线程安全的。这个到多线程内容时,这个再修改,目前的话呢,我们还没法去改,大家呢也看不太明白,所以你只知道我们现在这个懒汉式呢,是一个先生不安全的了,先记住这个事儿到后边呢,我们再说好了,那再回到我们说的这个笔试当中,笔试里边呢,如果他没有明确说让你去写二函式还是两函式,大家写哪个呀,其实其实都行,你要写饿汉式的话呢,直接就写这个就OK了,但是你要写懒汉式的话呢,你别写咱们现在这个。
08:26
你别写这个,因为这个呢不安全,你得写我们后边改以后的那个啊,得得这样,你要是说改以后那个,当时突然一下子一紧张,忘了忘了你就写恶寒湿,因为它本身就是线上安全的啊,你最好不要什么呢,你别写了一个它写完它以后呢,你下边还注了一下,说这个上述写法存在线象不安全问题,你存在不安全问题,你不改成一个安全的人要面试,因为说你怎么改成安全就忘了,是不是自己挖了个坑嘛,现在是吧,哎,就是要写的话呢,你得写成一个安全的啊,这要注意,通过这个呢,我们就区分一下它俩的一个不同,好。
我来说两句