2020-03-14 JDK并发包学习(微专业)

一、ConcurrentHashmap

1、jdk1.7版本

第一要点、table 里面有segment数组(是一个锁,也是一个数组),segment里面有entry数组,entry数组,是一个链表数组。

put(k,v)数据的时候,先对key进行计算出hash,看定位到那个segment,然后锁住,再继续对key进行hash计算,看定位到哪个entry数组。。。。

第二要点、多线程并发的时候,如果每个线程对key进行hash计算的时候,取得不用的hash值,则进入不同的segment,那么线程都还是能各自运行的;

如果是对key进行hash计算的时候,取到相同的hash值,那么对segment操作的时候,哪个线程先拿到锁就运行,其它线程进入等待。

这个就体现了并发包能保证线程安全的时候,还能保持高性能。

 2、jdk1.8版本

消除了segment操作,用entry数组保存数据,存入数据时,对key进行hash计算,如果数组的位置上为null,那么插入数据的时候使用cas操作,确保线程安全。

如果数组的位置上有数据存在,那么使用cync同步锁,确保线程安全。

 

posted @ 2020-03-14 11:39  math_lin  阅读(151)  评论(0)    收藏  举报