00:01
各位同学大家好,欢迎继续收看上硅谷doc高并发编程课程。刚才内容中呢,咱们完成了线程间的定制化通信,包括通过一段具体代码给各位演示了它的实验过程,那下面呢,我们继续往下学习,下面呢再来学习一下关于我们内容中的第五个知识点集合的线程安全。那这个我们要学什么呢?给各位来说一下,首先我们第一部分给大家演示一下集合到线程不安全的问题,这个集合咱们以例子集合为例,例子集合各位应该都很熟悉,所以咱们都演示,包括咱们把它的线程不安全问题演出来之后,我们讲解它的解决方案。包括用这个victor,用collections,还要用这个copy on right写实复制技术,最终把这个显示不安全问题给它解决掉,那下面我们就来具体完成这个内容。
01:07
首先咱们的第一个内容先给大家演示一下历史集合,它这个线程不安全,这个问题咱们就以历史集合中这个A瑞历为例来详细演示一下,那咱们下面具体来看一下这个内容。首先我们来写这么一段代码,咱们在里边呢,比如现在我就在里边,我来创建这么一个类,然后在那里边实现我们最终这个功能,那下面我来创建一下,比如说我就在这个look里边了,咱们直接做创建这个类,我起个名字就叫做这个thread。待某次。然后这个类里边,咱就演示这个线程不安全的这么一个特点,也就是我们的这个例子,集合线程不安全,这没问题,那下面呢,我首先加上这么一个问方法,在问方法中,首先咱们做第一件事情,我先创建一个这个a list,把这个我们先做一个创建。
02:18
然后咱们写下,现在我写上一个list,然后list中为了操作方便,给它加上一个泛型,这泛型我就加上一个缀。然后咱们起名叫list,等于new上一个叫A瑞,所以现在把这集合我们做创建。然后创建之后呢,比如现在咱们看一下这个,呃,Release这个源码,把这个我们点开,然后里边有它的相关内容,咱们找到厄约历中一个重要的方法就是里边那个。A的方法,那我们看到啊,A的话,它表示是不是像集合中加入内容,而大家看这方法上面并没有加上那个S的关键字吧,所以这里边它就是一个线程不安全的这么一个特点,因为它没有加上S的关键字。
03:14
那下面呢,咱们把这个线条不安全的效果,咱们通过代码来做一个演示,那怎么演示,我来写一下啊。比如现在我在里边呢,创建多个线程,然后在多个线程中分别向机构中加入内容,并且从里边取出内容,这个过程中会产生这么一个叫并发修改的异常,那下面给各位来演示一下。首先我先创建这么一个负循环,然后在负循环里边创建它这个线程,咱就扭上一个thread。然后里边加上这个拉姆的表达式,在里边咱们做第一个操作就是向这个集合里边添加那种,并且从集合中获取那种,咱们在每个线程中都来做这个事情,那首先我向集合中先加入那种,咱们用这个list色里边这个叫A的方法往里边是不是加那种那那种,比如说我就随机生成一个值,给它加一下就可以了。
04:27
咱们来一个u id.random u ID点凸缀啊,然后后面我加个截取吧,咱就基于这个零到八的这个大小。这个往里边加上内容,加完内容之后,咱把这个集合,就是现在我给他做个输出,就相当于从里边取内容,然后选之后加上咱们这个现成的名称,咱直接来上一个string,点这个very off啊,用这个I的这个值作为线程名称,最后加上这个大的方法,所以现在这个代码我们就完成了,咱们循环十次,里边有多个线程,每个线程都是向集合中加内容,包括从里边取内容,因为现在这个A的方法,这个过程中并没有加上SNE的关键字,所以它是一个线程不安全的,那下面给各位来执行一下,咱们看一下它的效果是怎么样的。
05:31
现在我来执行,然后大家看我第一次执行是正确的,因为咱们这里边可能他碰巧是成功的,那比如说为了明显我把这个十呢改的稍微大一点,让它循环更多次数,那我们多试几次,里边就会出现有一个异常的情况啊,比如说大家看目前异常应该就出现了,也就是里边的这个异常。大家看Java UT concurrent modify exception是不是一个叫并发修改异常,所以这个证明我们说这个a release就是一个线程不安全的,然后它的异常大家要明确啊,是在什么时候产生的呢?其实是在这一行产生的,就是我往里面放那种,是不是要从里边取那种,它在取的时候那种可能没放进去,或者那种放的过程中,因为它有多个线程的,所以造成问题就叫做并发修改问题,所以现在这个问题我们就点出来了,当然问题出现之后,下面问题咱是不是要解决一下关于这个线程这个不安全的问题,或者线程安全问题,那怎么解决呢?给各位说一下啊,咱这里边有三种方案。
06:45
第一个方案通过这个叫victor,第二个通过collections,第三个通过这个叫copy on right a list,那一会儿给大家就详细演示三种方案,但是目前你要知道啊,因为它没有加上S关键字,所以它是一个线程,不安全的。
07:05
这个效果咱们就做了一个说明。
我来说两句