00:00
我们接着来看下面一个。就是单例设计模式的实现,叫做双重检查,那么双重检查这种方式呢,是我们推荐使用的。为什么说推荐使用呢?因为它能把两个问题都解决,第一个它能解决这一个线程安全的问题,第二个呢,它还能解决效率的问题,我们来看一下,而且他把这一个懒加载也处理了,我们来看它是怎么做的,首先呢,这个single single to,就是我们说instance啊,Instance它呢。他这个呢,就是用一个VO去进行修饰,那VO这个关键字呢,是用来干什么的呀,它可以去让我们的修改值立即更新到储存,也就是说你可以把它理解成是一个轻量级S。那它这个这个用处是还是比较大的,然后呢,大家看最最关键是下面的代码,下面代码它在它在这里面,相对这个判断single是否等于空,OK,如果它等于空,它就会进到这面这面代码里面来。
01:11
记到这个代码里面呢,有一段同步代码。同步代码OK,也就是说他进到这个代码里边呢,只能是什么呀,只能是一个线程。那这样子大家可以看到,当有一个线程进入到这个里面以后呢,它再去判断是否等于空,如果等于空,它就会去创建一个对象11。就会创建一个对象实例,然后就出来就就出来,那大家想。也就是说,这段代码。这段代码它能够保证,就是它能够保证只有一个线程在这里执行,对不对。只能保证一个线程在这里执行,那保证完了以后呢。当。当下一个线程再进来的时候,当下一个在多线程情况下。
02:02
他假如说我们说假如哈,就就假如这个第一个线程进来的时候,他已经进到这个S了。进入到这个size了,进入到S过后呢,他他把这个创建创建完了,创建完了,创建完了过后,这个时候假如有另外一个线程呢,它正在这个SNCH代码外面等着。他也,他也这个时候他也进来了。他他假如是在这个地方进来过后呢,他会发现S痛呢,已经不等于空了,他也不会再去创建,对不对,那以后就更方便了,以后再有多线程进来的话呢,它直接就在这个if辅语句就被控制住了,因为这个时候他再来判断的时候。直接这个SYNCH就已经不等于空了嘛。所以说就。就不会再去做这个工作了,就直接返回我们这个申通,因此这个双重检查这种方式呢,其实是比较优秀的,比如说我们推荐的,我们来把这个代码先写一下再来分析好吧。
03:05
那这个是我们的第几种写法呢?是我们的第六种写法,因为第五种我没有写了。TYPE6。TYPE6,好,我们把代码呢给各位同学实现一下。我们看看它是怎么来实现的哈,同样我把这个代码粘贴复制一份。粘贴复制一份,然后我把这个改成零六,这是我们的第六种写法。好的,这边写个六,注意听。提个六,看我怎么改一下就可以了,这是我们的双重检查。方式对不对。双重。双重检查。那么我们怎么来实现的呢?首先在这个位置我们加一个关键字。那么这样子呢,我们可以让这个共享的变量,它一旦有修改值,立马就修刷到这个储存里面去,而且呢,它在一定程度上也可以达到这个同步的效果。
04:05
那紧接着呢,这边这个公有的方法我们还是有的,同样这里面我们加入的是双重检查的代码,加入双重。检查代码,它解决线程安全问题。同时解决。对,同时解决什么呢?解决这个懒加载的问题。难加载问题,OK,那怎么改的呢?像这个就不是懒函式了啊,那怎么写,那我们把这个代码再给大家稍微的改一下。呃,If这句话不用去改,SNCH加句SYNCH加不同步。Sized对谁进行呢?Single?OK single class。同步,同步呢,在这里面我们再加一句话,如果。如果什么呢?Instance,它等于了空,OK。
05:01
在这个同步代码块里面,我们再判断一次,就说。第一次判断,第二次判断双重检查。大家看这个有什么好处啊?我刚才其实已经说过了,再给大家聊两句,比如说现在我有两个线程,一个是A,一个是B。到这来执行的假设,它瞬间都进入到这,比如说A进入到这这这这一行了,A到这来了。好,A和B都到,假如都到这儿来了,那么A假设它先进入到这段代码。A假设先进到这段代码,这是有可能的,呃,那A一旦进来过后呢,那B就进不来了。好,A呢,完成了一个。创建对象实例的任务就出去了。好,他走完了以后B再进去,因为为什么B再进去呢?因为你A执行完了我就进去嘛,这是可以的,但是当B进来的时候,A已经完成了对新通的实体化,那显然它就不能再进入到这个if代码块,于是它也就退出上面整个if,返回上一次A线程创建的对象实例。
06:15
那假如以后后面还有CDE来了又怎么办呢?好,这个时候他在de这一级就已经控制住了,因为C再来判断已经不等于空了,它就直接返回,这样呢,我们同步这个这个位置呢,也不会反复的执行,因为大家都知道同步代码呢,它的效率是比较低的,也就是说从CDE这个多线程来看呢,它也不会再去执行这个阶段同步代码,于是我们的效率呢,也不会受到影响。只是一个判断嘛,他不会再去做同步代码的检测,效率就会得到保障,明白我的意思吧,好,所以说这个问题呢,它完美的解决了线程安全问题,也解决了哪家的问题,同时呢,保证了效率。
07:00
对,同时保证了效率,这个方法是我们强烈推荐的,推荐使用,就我们推荐使用。好的,同学们,我们来玩一把,看看行不行,好,行不行,我们运行之运行。我们运行这个双重检查呢,发现也是没有任何问题的,好,这个方法呢是推荐给大家,好,我们来做它的一个简单的分析,优缺点的分析,Double check概念是多线程开发中这些经常使用到的,在代码中显示出来了啊,我们用过了,我们进行了两次1SINGLE通等于空的判断,这样就保证现场安全,大家看这时实例化代码呢,只会执行一次,下次再访问的时候判断if是这个single通是否等于空。那么如果它不等于空,直接就返回了,这样呢也避免了反复进行,方法的同步效率得到了保障,而且大家看到线程的安全延时加载也实现了,因为我用到我再去。
08:01
实例化的对吧,效率也较高,因此我们在实际开发中呢,推荐使用这种单利模式的方式来完成,好吧,这就是我们双重检查的这种单利模式的设计方案还是比较OK的,还是比较OK的,好的,那关于双重检查我们就讲讲讲解到这里。
我来说两句