00:01
各位同学大家好,下面呢,我们继续来学习集合的线程不安全的解决方案,刚才咱们讲到了vehicleor,还有这个collections工具类,那下面呢,咱们说一下里边的第三种方案,通过doc里边提供的一个类来解决,这个类的名字刚才咱也看到了,它叫做copy on write a list,通过它就能解决线程不安全问题,那这个代码我们先写一下,然后给大家讲解这个copy on right,它的原理到底是怎么样的,那咱们下面把这个代码我们先实现一下。首先我在这里边,我们来做一下这一行代码,我先入掉。然后下面呢,咱们重新new上一个新的一个对象,这个对象的名字就咱们刚才说的名字叫做copy on write a release,然后咱们new完之后,那这个线程不安全问题就解决了,通过这个对象来解决,那这个咱们写完之后,下面我们把代码执行一下,咱们看一下最终的效果是怎么样的。
01:15
现在我来执行,然后各位看第一次成功,我再多执行几次。咱发现是不是都是成功的,所以现在问题就解决了,这就是咱们的第三个方案,那这个方案copy on right release,这到底是什么意思,或者说它的底层原理到底是怎么样的?下面给各位同学我来详细分析一下,说明它的原理是怎么样的。那我们来看一下啊,这里边各位注意有两个单词,一个叫copy什么意思,是不是叫复制意思,一个叫right什么意思,是不是要写的意思啊,所以这个类它有一个描述叫做写实复制技术。
02:03
那什么叫解式复制呢?给大家解释一下啊,比如说我现在啊,有这么一段内容,那我们对它首先是不是可以进行一个读或者写操作呀,在你读操作的时候,这里边比如说我现在有很多这个人都来读我这个内容,比如是一个集合都来进行读,那读是不是肯定是一个并发的一个读,所以这是第一个啊,它叫一个并发的读,就很多人都来读这个几个中内容,但是我在读内容中,我是不是可以像集合中写那种,所以他写的时候会怎么做呢?就用到我们的技术叫写实复制技术。大家注意啊,读的时候支持并发读,就是多个人都能读到第高中内容,但是里边还要做到一个写操作,那他写怎么做呢?写到这个位置。比如现在我们要做写,他的写就不是并发写了,叫独立的写,通俗说就只能有一个人写。那写怎么做呢?他的做法就是首先里边的第一部分先复制一个跟之前集合相同的这个大小或者相同内容,一个集合就做一个复制。
03:16
比如说我现在啊,我在里边先复制出一块区域,假如说这块区域就是咱们复制之后的这块内容,我就简单画一下啊,这个意思就现在就是我复制之后内容,然后复制之后呢,就之前读的这个人还读之前东西,但是我复制之后,我可以往里边写入这个新的内容啊,就是写入。新的内容,而当我把内容写完之后,那这时候怎么做呢?咱就可让这个读的这个东西再去读我们新的内容,也就说把你这个复制之后,东西跟之前这块区域做一个合并,就最后再做个合并,然后合并之后让你读的这个人都来读取我这个新的这个里边的这个数据。
04:06
比如用三个啊做一个合并,最终来读它,所以这就是我们说这个写实复制技术,我再说一遍过程怎么样啊,首先咱们读肯定是并发读,多个人都能读几个中的东西,当我要做写操作怎么做?第一步你先复制一份,就是复制一个跟之前集合相同大小这么一个内容,然后复制之后往里边写入新的内容,当你写完内容之后,咱们把这个新的东西和之前的作梗合并或者覆盖这些内容,最终再读,就读咱们新的这个里面内容。啊,就是读取你的新的集合中的内容,第一个过程就叫做写实复制技术,每次写的时候先复制一份新的内容,然后往里边写东西。最终再合并,每次写复制一个往里边写,然后最终再合并或者叫覆盖,这样的话就完成了我们这个操作,而这种操作的好处是什么呢?既兼顾了咱们的并发毒,也照顾到了咱们的独立写操作,就不会产生并发修改的这么一个异常,这是我们说的这么一个原理。
05:19
然后这个过程呢,给大家也可以举一个比较现实的例子,例子是什么呢?比如说我们看啊,有一个这个签到的这个例子,就是一个典型的。写实复制技术,那我来举个例子啊。比如我现在啊,我在一个就是班级里边,我现在拿着一个人名单,是不是进行签到,而我在签到过程中,比如现在我经过了第一轮点名,我把到的人是不是画上一个对勾,表示人已经到了,那这时候我画完之后,是不是很多人会来找我,说我没有签到,我没有叫到怎么怎么样,那这时候很多人是不是都会来到这里边来看一下我这个人名单呀,这个过程就咱说这个并发读的过程,比如现在来了很多人来读我这个内容。
06:08
然后他在读的时候呢,比如现在有人告诉我说老师我这个没有被签上,那他怎么做,是不是要划入新的这个人啊,那我怎么做,就是现在我人名单我有两份,第一份这些人继续看,然后我现在就拿出一个新的人名单,往里边就加入新的那种。比如说现在又来了两同学,说我没有被签到,那我给他是不是往里边画上对勾啊,然后等我还完之后,这时候我告诉其他人说现在各位看我这个新的这个名单,里边有各位最新的签到信息,那这些人是不是就要看我最新的名单呀,而就不需要看这个老的那个名单了,这个过程就叫做写实复制技术,每次加入新的内容,咱再复制一份,往里边写新的内容,写完新的内容之后,再覆盖合并之前的那个即可。
07:03
这样的话就完成了,咱的操作既兼顾了并发读,也照顾到了独立的写操作,这个关于写实复制这么一个原理,然后这个说完之后,咱们也可以看一下它的源码里边是怎么做到的,咱们来看一下啊,这是它那个源码中,它里边就是一个最基本的这么一个结构,那这个结构我们来看一下。比如说咱们找到里面那个A的方法,就这个方法,呃,A的方法啊,给他先找到。就是这个,然后在A的方法中呢,其实就是我刚才说的过程,那我们看一下啊,首先你看第一部分。这干了什么,是不是就上锁呀?这干什么,是不是就解锁呀?然后在过程中,首先先得到我们的数组,得到长度,然后得到数组之后把数组做这件事情,就是什么copy是复制一分啊,然后复制之后往里边写入你的新的这个内容,你看啊,向新的这个element里边写入你的那种,然后写完内容之后,把你新的数组是不是在覆盖或者合并之前的那个数组,最终完成这个操作,所以这就是我们说的写实复制技术,用它也能解决这个线程安全问题。
08:24
所以这个我们就演示完成了,所以各位最终记住啊,A release是线程不安全的,而咱们解决有多种方案,三种比较常见的,第一个用VE,第二个用collections工具类,第三个通过这个写实复制技术最终进行解决。
我来说两句