00:00
那接下来呢,咱们再往下继续,这叫做读写所,是不是也是所呀,我们说读写所又是个什么意思呢?那通过这个我们说是不是读写分开呀,读写分离是吧?到底是什么意思?实际上这个道理在之前咱们已经已经经常的去灌输这个问题了,我们说通常呢,读线程的话,我们说需要读,读取数据需要是线程安全的吗?对吧,比如说读取对吧,比如说就像呢,相当于大家现在是不是在看我的屏幕啊,对吧?看我的屏幕,我在这里写,你们是不是一一块看呢?对吧,你们同时看有什么问题发生吗?那说没什么问题吧,这啊,我说只需要在这里一起我写就可以了呀,然后你们这么多人是不是一直在读啊,他也不会产生什么相应的现场安全问题,对吧,通常我说这种方式呢,或者说或多或少可能有不到重复数据的,这我们是不是也可能也可以避免呢,对吧,也可以忍受那么相应的写,那比如说那咱们同时往这来写,那你说听谁的。
01:01
那时候就不知道了呀,所以说呢,我们说所谓的这个读写所指的事,通常我们说这算是也算是一种叫做乐观所,所以原来我们说只要有现场安全问题,是不是就直接上锁呀,直接上个锁,但是你不管你是读还是写,一次只能有啥是不是一线程对吧?那样的效率,那是不是想想就是第啊,而现在呢,我们可以把它分开,我们说写你是不是一次只能有一个,但是读你一次是不是可以有N多个,那这样的话,只要你读访问多的话,那我们说这能不能提高效率,是不是也能提高效率啊,对吧,我们说你解决线程安全问题的方式,你不是说一上来就全来个锁对吧,来个独占,一次只能有一个线程独占,而现在呢,我们说就可以用读写所,那么要用读写所呢,我们首先要考虑的问题是什么呢?你得清楚在什么情况下对吧?呃,读写。
02:02
所我们说什么情况下用读写索,我们首先说你写,如果多个线程写写对吧,两多个线程都聚在写的话,那我们说你是不是得是先行安全的,所以说写写这个操作是不是要互斥,是要互斥吧,对吧,那相应的那是一个在读,一个在写,要不要互斥,那这个也是要的,对吧?那那你说两个要是同时进行,我写到一半之前不是也说过这个问题吗?你写到一半就被读了,我也有可能有问题呀,对吧?所以说严谨的期间,我说写写要互斥,读写也要互斥,对吧?所以说他们呢,叫做需要叫做互斥,指的就是一次是不是只能有一个呀,但是我们说通常要是读读需要复视吗?那时候读读不用啊,对吧,那我们说你一个线程去写100个线程读,对吧,那它读读是。
03:02
不需要对吧,不需要不吃正明吧,所以说那这个时候我们不能像原来似的对吧,只要有现场安全问题,就是一个说,不管你读还是写读上,而现在你有更好的一种解决方式,叫做read write lock,是不叫读写锁呀,那过来呢,我们可以简单的搂一下API看一看,所以说是不是读写所呀,也是这个con看高效了吧,对吧,也是这个1.5以后的说说这个读写所呢,维呃维护了一对,是不是维护维护了一对所呀,对吧,维护了一对所说一个用于读操作,一个用于写,就一个读,一个用写啊这个一个read red lock,它维护了两个所,一个是读所,一个是写锁吧所,如果说这个读所它可以叫做呃叫做这是多个线程吧,是多个线程并发的持有是多,这是不是毒索嘛,毒。
04:02
所是不是可以多个线程并发的持有,对吧?多个独线程并发的持有是这意思吧,对吧,我们说独所可以多个独线程并发的去持有,然后呢,一定时间或者是长时间是没有写的吧,对吧?然后呢说写索它是这叫独占的含义是独领取多个线程是不是同时持有啊,但是写索是不是只能是一次只有一个还是独占,那这就是read red lock的一个含义作用,这能听懂啊,对吧?那接下来怎么用,注意看它说两个方法呀,一个叫read lock,一个叫做redlo,都是什么,是都能返回log呀,返回look是不是就有lock上索a look解锁,对吧?那过来我们就试一试来的同用,比如说呢,现在呢,我们搞一个例子吧,比如来个DEMO让他去。变写了,我是不是来两个操作呀,因为一个图一个写了,那这个时候我是不是都是操说的都是操作共享数据啊,对吧,来个remember,嗯,初始值为零嘛,然后呢,一个呢,我们说去读,是不是一个读操作读取数去,那就word叫做get读,读的话那也就是sit out,是不是说完了就输出啊输出然后thad.current thad.god name拼上这个冒号,拼上a number,拼上number的值,这是不是叫读啊,那么相应的我再先写个写,把它写完,那是不是相应的是一个写啊对吧,叫word,那说白了是不是叫set,咱们就写的简单一点啊,写是不是就this number等于number,是不是传过来一个number,是不是传个number啊,对吧,这是不是就叫写改数据啊对吧?在这里呢,我就简单的打印一个现成名就完事了,是不是一个写。
05:58
能做呀,那么接下来我们说他们既然访问的都是共享数据,Number存不存在线程安全问题啊,是不存在啊,但是我现在说读,你是不允许多个线程来读,同时多个线程并发的来读吧,但是写一次是不是等到有一个,因此这个时候呢,我们可以选择另外一种方式,叫做read write lock,是不是读写锁呀?Write write right read write lock r对吧,是不是叫读写锁呀?然后来个lock,等于NEW1READ right叫做retreat呀。
06:36
Read right lock是不是接口啊,它也得有rere read right lock看懂吧,是使用方式都一样啊对吧?然后接下来呢,那我们是不是就开始加锁了,叫做lock点,刚才我们看到了它有个叫做堵锁了,是不反应个lock呀,那通a lock,这是不是叫上锁,相应的,刚才咱们说了,你只要有这个上,你别忘了先把什么写出来,哎,Unlock是不是并且给它写到finally中来啊对吧?然后来个叫做lo.rightlo.alo对吧,把这个写过来,这是不是叫释放锁呀,释放锁的操作,呃,不不不,Read呀,是不是readlo呀,对吧,Readlo他俩是不是就一个了,对吧,Readlo呀,释放锁这是不是读锁呀,对吧?读锁那相应的,那是不是写锁也一样,对吧?那写锁的话那就是lock.right。
07:36
lock.lock对吧,是不是上锁相应的呢?有了这个你说也得把它是不是先串一下啊,对吧,然后来到finally,也就是lock.right lock.lock把写放这。是完事对吧,那这就是所谓的读写索,那相应的接下来我是不是搞,比如说搞一个线程去写对吧,100个线程去读啊对吧,对吧,那就是这样一解决的就是这个问题啊,当然这个呢,也没有什么太大的效果,那么这个时候呢,我们创建一个叫做read red lock对吧,就是RW读写叫做new,一个read red lock DEMO,然后呢,一个threadadnu个thread,然后new个是啊接口,然后把这个删掉,说这个呢是一个线程写吧,对吧,比如说这叫做热写索对吧。
08:38
Right是不是写啊,点start对吧,然后呢,这里RW点叫做set set一个set一个随机数吧,可以吧,Int来个叫做ma,点上random乘以101对吧,实际上有个更简单的方式,是不是用一个random好了,那另外一个是不是要写索呀,写索我是不是来搞100个线程,然后去去写呀,对吧,我们说允许这个100个线程同时去写,然后来一个后循环,I等于零,I小于100,然后呢,也用一个start,用一个就run啊对吧,然后呢,在这里呢,也都给它start启动,通过这个呢,RW.get是不是100个去读,一个去写对吧,一个写100个读,这能看懂吧,那有可能什么呢?
09:38
啊,有可能你第一次是不是没写上啊,对吧,然后后续是不是才写上呢?对吧,就看谁快谁慢嘛,有点执行注意看刚开始读是么,那个是没写上呢,读的快写还没写上吧,然后当我write写过之后,接下来是不是100个线程同时在读是吧?是不是并方能在读啊,N多个线程同时的在读吧,对吧,那同时在读,那这就是一个读写组对吧,含义是大家只要掌握,这就叫做这个读写和写写要互斥,但是读图之间不互斥,对吧?那这样的话想想是不是也比原来那种独占所效率要高,对吧?在你读取数据的时候可以并发的执行。
10:27
同学们好了,那这就叫做读写组F。
我来说两句