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同步锁,确保线程安全。


浙公网安备 33010602011771号