00:00
前面我们讲了两种。这个。二汉式就是一个是静态常量,一个是静态代码块,我们再来看下一个就是懒汉式。针对前面。我们所说的这个二汉斯而言呢,它是在没有使它是在内加载的时候,就产生这样一个实力,对吧,那。我们为了解决这个问题呢,可以用懒汉式,懒汉式呢有这么几种写法,我们先看第一种线程不安全的一种写法。这种写法呢,也是在一些这个程序里面会出现的,我们来分析一下这种写法它会存在一些什么样的问题。呃,我们先写代码吧,我们先写代码来走一个。那我在这儿建一个包。对,建一个包叫太山,这是我们第三种写法,对不对?第三种写法呢,我们写一个类。建一个类好的叫single。Single。
01:00
然后TEST03。对,然后呢,这边我们建一个。建一个类啊,建一个类。Class。Class single。那我们怎么来完成这个东西呢?首先跟前面的思路大体一样,我们首先有先写一个single form,它的instance还是instance。好,它是一个静态的。没有初始化,然后呢,我们把这个构造器仍然进行一个私有化的操作,就是防止呢变六。好,是这个没有问题,下面呢,我们提供提供一个静态的公有方法。公有方法当当什么呢?当使用时,当使用到该方法时,该方法时才去创建什么呢?Instance哎,这就跟以前不一样了,我们把这个呢叫做懒汉式。
02:06
懒汉及这边就是懒汉室。懒汉。懒汉市。汉室啊,懒汉。懒汉。是OK,那代码我们给大家写一下public static,然后呢,我们返回single。那这边写的方法仍然是instance。In。Are in ten。对,那么我们再来做一个判断。如果说。这个新就是我们这个instance哈。Instance就是这个。如果我们当前这个instance对象实例,它等于空。对,它等于空说明什么?说明你还没有创建,如果没有创建呢,我们这个时候才去创建它。等于六一个instance啊,In single。
03:03
最后创建好了过后呢,我们return instance。好,这样子就写完了,大家有发现这段代码。跟前面不一样的就是,它是在使用到get instance的时候才去创建我们这一个。单利对象。这就是他最大的区别,我们也把这个叫做懒汉式,就用的时候我们才去创建来,我们使用一把,使用也很简单,这个跟前面一样,我就不啰嗦,把这个代码复制过来就可以了,好吧,推一个栏。OK,我们运行一下。这个地方。去掉。运行一下,好,我们在这呢写一个注释,这是懒汉式。懒汉。懒汉市对吧,但是这个地方懒汉市的第一种呢,它是县城不安全的。
04:00
县城不安全。那么待会儿我们分析为什么不安全,好吧,运行一下。我们运行起来,我们看代码有没有问题,我们发现呢处,也就是说它确实能够保证两次返回的对象实例仍然是同一个,这个很很好理解,因为当我们调get instance的时候,第一次调的时候呢,Instance是等于空,于是它创建一个这样的对象实例。但我们第二次调用get instance的时候呢,它这个条件就不满足了,为什么?因为它不为空,就直接返回,已然是返回的。这一个成员变量是吧,成员变量好,我们来分析一下这种问,这种懒汉式它的优点和它的缺点,我们来分析一把。首先我们先说它的优点,它的优点呢,的确能够起到懒加载的效果。为什么是懒加载呢?因为我用到我才去。创建我用不到我就不创建,那显显然我这没有浪费。
05:03
但是呢,这这种写法只能在单线程才能使用,为啥呀?同学们看啊,注意听这句话,小心面试官问你,我们这种写法呢,如果在多线程下。多线程,如果有一个线程进入到if。这个判断语句了,它进已经进到这个if了,比如if这个他判断是成立的,就进到这里面去了,于是他就去六我们的对象实例没问题吧。但是如果他还没有来得及往下执行另外一个线程。因为你是多线程嘛,他也去执行我们这个if判断语句,是不是这个时候,因为它还没有还没有创建,于是这个条件仍然是满足的,那两个线程都进来了。那就会产生多个实例,那你这个懒函式就虽然说能够达到懒加载的效果,但是你就不是单利模式了。所以说这种写法呢,在多线程环境下是不可以使用的。最后这个结论,在实际开发中不能使用这样的方式,因为它有潜在的风险,就不能用。
06:11
它这个就是错误了,上面那种恶汉式呢,虽然它不能起到懒加载的作用,但是它的确是单立模式,这个没问题,你现在这种写法。这种写法它就有可能就已经破坏单利模式设计的初衷了,因此这种写法呢,不能用。啊,好,这是我们讲的懒汉式的第一种写法,现场不安全写法就先说到这儿。
我来说两句