00:00
基本上这什么就是这个con,看哈希迈这里提到了一个叫做索分段机制,我们说实际上在这了个1.5以后,对吧,或者说扎到5.0以后对吧,人家给我们提供的这个抗抗包中,其供了多种并发的容器类,用于改进同步容器的一个性能,其中呢,对吧,改善最好的或者说应用最广泛的,那就是这个叫做con哈map,那么我们说这个con map它到底是一个什么东西呢?他是不是说白了就是一个现程安全的哈希表啊,对吧,之前咱们是不是也提到过,我们说原来的哈希迈和哈希table宝有什么区别?哈map是线程不安全的,哈table是线程安全的,对吧,那就是这个区别,所以说我们说哈table它是不是效率低呀,我们哈希table呢,为什么效率低呢?我们哈希麦和哈希table实际上底层实际上是不是都是一样的呀,都是这种哈希表。
01:00
只不过哈sh table的区别在于什么呢?哈sh table它是不是有锁呀,并且它的锁是怎么个锁法,它是不锁整个表是不是全手个表啊,也就意味着说,当多个线程同时并发的去访问这个西table的时候,访问这个叫哈希table的时候,那说白了那就是并行转换成了串行的一个操作了,是不是也就是一次只有一个进来,不管你是增编改啥,你是不是只有一个能进来访问我的哈信猎包,对吧?什么时候进来一个,把这个表整个表都访问完了,下一个是不是才能进来啊,那这就存在了,这个叫做效率低,哈希table效率非常低,因此以至于我们说我们即便考虑现权安全问题,我们是不是也不用它呀,对吧?效率非常低,它不仅效率低,它有的时候呢,它还存在一些复合操作上的一些安全问题,什么叫复合操作呢?比如说例如于这样的操作叫做呃弱。
02:00
不存在则添加,这算不算是复合操作,你得先看看存不存在不存在,是不是再添加呀,然后呢,类似于什么呢?比如说这个叫做什么,若存在则删除,这是不是也是负合操作啊,那要是在我们代码都能体现可能类似啊,注意啊,是不是可能大概就是这样的操作呀,说这个什么,这个table.contains对吧,T con。Contents添TS是不是这个啊,说如果什么这个叫做不存在,你是不是再去添加对吧?Table能是I的吗?那是不是得put呀,对吧,你说不再再自己,比如说这里来个什么put操作,对吧,叫做这个table.put那是不是就意味着在你cons以后,说在这个位置有没有可能被剥夺执行权呢?是不可能啊,我说contains方法有独立的锁探方法可能也有独立的锁,但是他们俩拆分开来了,这个时候第一个线程抢到了锁,对吧,第二个线程呢,在做第同样的操作的时候,被他抢到去了,他给人成功添加了,那这个时候你是不是已经到这了,获得所是接这个技术往下执行,这有可能啊,对吧?那这样的话,类似于这种复合操作,他之后也是线程不安全的了。
03:20
对吧,那这是哈希table,那首先它是效率是比较低啊,当然最最核心的问题还是它效率低,因此呢,在这个这1.5以后,人家Java斯给我们提供了一些大量的用知识并发的一些容器类啊,对吧,那其中一个比较好的呢,就是这个叫做concuent哈map对吧,Co,嗯啊int concu哈希map他采用的是一个什么东西呢?所采用的叫做什么来着,叫做所分段机制对吧,叫做所分段机制,它实际上是一个什么东西,所分段指的是说首先它有一个叫做叫做呃并发级别叫做concurrent对吧,Concu level leve concud level,这个concu level是不是叫分段级别呀,默认的级别为16,说白了就是它默认是不是有16个段,默认呢,有16个段,也就是说在。
04:21
这里呢,可能有16个段,那么咱们就不画那么多了,没问题吧,16个段,段指的是什么东西啊?段指的叫做segment seg segment,然后呢,每个段中呢,默认呢也有16个,对吧?是不含系表的长度,默认是不也是16啊对吧?然后这里边是不是有一个个的元素啊,说每个段呢有这么个东西,然后呢,在每个表中是不是就产生那个叫做一个个的链表,是不是有电表啊对吧?得有这个链表,它有前后索引啥的,咱们就这样画链表。
05:00
列表对吧。在这个基础上,是不是每个都有这个链表啊,对吧,都有链表,然后呢,前后练到一块去吧,大概呢,就是这么一个效果。嗯,再来一个。别着急啊,我瞄准点,嗯,大概是这么一个效果对吧,然后呢。是不,这里也有啊,对吧?所默认呢是16个段,然后每个段呢,里边是不是独立的表啊,对吧?然后形成一个列,那这样的话,它的好处是什么呢?注意它每个段它都是一个独立的所,是不吧?就每个段都是独立所呀,每个段都是独立的所,这就意味着什么呢?这就意味着当你有多个线程并发访问时,你说其中一个访问阵啊,另外一个是不是有可能访阵啊,另外一个是不是有可能访问阵,对吧?那这样的话是不是就实现了一个叫并行啊,那有了这种并行的效率明显比刚才那个串行效率要高很多了,也就是多个支持多个线程同时访问我这个map,它不仅线程安全了,而且它是不是并行了,效率也高了,效率也高了,那这就是con哈希map的一个特点,采用的叫做锁分段机制,这能听懂吧,对吧,并且呢,它也提供了一些复合操作的方法,对吧。
06:27
啊也提供了类似于复合号用于提高效率,那这就是con哈西map,这没问题吧,对吧,就想想这种首分段机制,它效率也高,所以说我们说你要是不知道这个东西的话,对吧,你用你要是用多线程,那原来我们用多线程,那是不是你把这个你可以把哈希麦克直接转换成关成啊通过connection有个什么方法呀,叫做single map的map,对吧,说connection工具类里头提供了很多同步方法呀,对吧,你就可以把一个map转换成安全的,实际上它怎么个转,它就是把里头的每个方法都加了一个single ne关键字,听懂吗?对吧,所以说CL哈奇麦就是能提供,那我说这力说1.8,对,这个是不升级了,升级成啥了,分段,分段所几乎已经是不是被取消了呀,对吧,然后它采用的是不又是CS啊对吧,所以说咱们要提CS对吧,这题可。
07:27
点八以后把CR哈西map底层也变成了CAS,大量的采用这种CS,我们甚至都可以把CAS理解为叫啊是不是无锁算法对吧?相较于有锁的区别就在于CS对吧,它是不是不会阻塞呀,不涉及到上下文切换的问题,所以说它的效率会相对来说高啊好了,那至于这个con I map怎么用,那是不是就是原来mapb怎么用,Con和I mapb就怎么用啊对吧,别的没啥区别了啊,就知道这个原理,大家能灵活用就可以了,我们除了这个comp和那以外,对吧,它还提供了一些其他的,是不是有容器类啊,比如说比如说这个这个是吧,如果有这个类通常是不是同步的话优于吹map对吧?说你当你要访问吹map,操作催map,同时你希望它现在安全,是不是找他啊,然后相应的,当你希望读数和便例远远大于列表的根新数时,我们是不是可以考虑这个叫做copy on right release呀去。
08:27
代替A同步的a list是不是呢,都能有某种情况提升啊,相hat也有对吧?这里是不是还有这个copy on right set呀,对吧,他解决了一些问题,过来看看咱们它解决了一个什么问题,也稍微的试一试,叫做tap copy on right吧,叫吧,Write a list对吧,这个翻译过来叫啥意思啊,是不是叫写对吧,写入并复制啊对吧,叫写入并复制,相应的它有对应的呢?是不是就是set呀,叫做写入时对吧,写入写入并来个复制,说它主要解决的是一个什么问题呢?我们可以过来试一试,比如说过来来个叫做hello th,让他去implement runnerable对吧,然后结合对吧,然后呢,在这里面我们做一些什么操作。
09:27
那呢,比如说我们来个叫做list,带这个里边存使G叫做list,等于我们说我们是比如现在都是考虑现车安全呢,那原来解决线车安全问题是不用collections工具类有个叫做singleized,是不是有对应的什么list set map是不是都有对吧?我们可能要list,然后你用一个list,它把这个string泛形string说法它包装一下,含义是它的包装方式就是把里边list里边方法都变成了同步方法,听懂吗?但是呢,我说原来的这种集合它存在一些什么问题呢?就说再迭代的时候,我给这里添加点数据吧,添点数据就用一下static,可不可以点I的一个AA,然后BBCC,这没问题吧?啊,那这叫做静态代码块对吧?然后呢,在这个时候呢,说我这个线程一执行线程直行体干嘛呢,迭代叫做S。
10:27
A to啊遍历string it等于list点,然后呢,在这里来个while it.has next,我是不是可以取一下啊对吧,取一下,然后与此同时呢,我边取我边加例点A,我要往里加对吧?首先说迭代操作,对一个集合来说,那是经常用得到的,那么现在呢,我边迭代边添加元素,那么这个时候大家想想你觉得会发生啥问题,以前咱们试过这个问题,哎,所并发修改异常啊吧,对吧,他就会发生并发修改异常,我也再来个十个。
11:11
来十个县城都去并发的访问,这个什么情况,这个麦来个hello th HD的又一个hello thad,然后呢,在这里拗一个TH过来,HD传过来,点start是不是启动了。什么情况没了是吧?啊,那这样的话,我们是不是十个线程都去并发的去访问这个呀,那这个时候都不用想了,原来我们一个线程是不是都报报错啊,对吧,这个时候叫con the motivification exception叫做并发修改异常对吧?所以说原来的这个集合呢,如果是线程安全的,它是不是也有这个病患修改异常啊,对吧,然后他进行迭代,为啥呢。因为它迭代和list是不都操作的同一个数据源呢,是白了,那这种情况下呢,我们有一种另外一种好的解决方式是啥呢?叫做copy on right对吧,我们来看叫sta对吧,然后呢,也指定泛型,然后叫list,叫做copy on copy py啊right list是不是搞这个东西啊,对吧?至于其他操作大家看是不是都一样,但是呢,这个时候我要是并发去访问他的话,发现有问题吗?为啥有这么多A,我是不是再添加A呀,对吧?发现并发修改异常是不是没有了,我说得为什么并发修改异常没有了呢?注意看这叫啥是叫写入并复制啊,实际上是什么意思呢?说这个copy on right list,它的作用是当你每次写入时,它都会在底层完成一个复制复。
12:59
这个新的列表,然后呢,再进行添加,每次写入时都会复制。
13:07
听懂吧,每次写入时都会复制,那因此我就得到的结论是,你每次写入时你都复制一个全新的,是不是跟其他的相互相都不干涉呀,那因此这个并发修改异常会发生吗?是不是不会呀,但是你们说那你每次复制效率低不低,那是不是就很低呀,对吧?所以说这种我们说都需要考虑现在安全问题的时候呢,我们可以选它,但是选它的时候你是不是要慎重啊,你要添加操作多,你适合用它吗?是不适合呀,因为你添加操作过多,你要是选它,它每次添加的时候,你他都得来个复制的操作,那是不是开销非常的大呀,就说添加操作多时不适合选档,那他适合干什么呢?适合迭代。听懂了,它适合如果迭代操作,它这个如果迭代操作多,对吧,那与此同时你又有并发迭代操作,那这个时候是不是选它呀,它的效率会比同步的那些这个a list效率要高,对吧?所以说在应用它的时候呢,一定要注意,对吧,说添加操作多时对吧,多时那它的效率会低对吧,说添加操作多时效率低,为什么效率低呢?因为每次添加时都会怎么样啊,都会进行一次复制,都会进行复制,那么开销会非常的大,所以说添加操作多时不选,那什么操作多时呢?叫做并发迭代操作多时可以选择对吧,能够提高效率。
我来说两句