学习JDK的并发容器记录

一些好用的工具类

ConcurrentHashMap:一个搞笑并发的HashMap,线程安全.

CopyOnWriteArrayList:一个List,和ArrayList是一族的,适用于读多写少的场合,好与Vector.

ConcurrentLinkedQueue:高效并发队列,使用链表实现,可以看成一个线程安全的LinkedList。

BlockingQueue:一个接口,通过链表,数组等方式实现,是一个阻塞队列,适合数据共享的通道。

ConcurrentSkipListMap:跳表的实现。

在链表中,尾结点的更新具有滞后性,主要是在一个空队列中,在一个for循环中,先让p和t指向头部。然后q=p.next为null。执行CAS中的p.casNext方法,将p的next指向新加入的元素。第二次循环又加入一个新的元素后,但是q=p.next不为空

,因此遍历这个链表找到最后一个元素,赋值给p,在一次循环时q=p.next为空,判断p.casNext的期望值又为null,所以在此添加进新元素,并且p已经不再头部即p!=t,所以调用casTail将t指向尾部,返回true。所以添加两个元素时,尾部指针才会更新。

    CopyOnWriteArrayList:只会对写操作加锁,写操作会复制原来的Array,在进行元素添加后,覆盖原来那个array。

BlockingQueue:以ArrayBlockingQueue为例,poll()和offer()会在队列为空或者满的情况下返回flase。主要考虑put()和take()方法,如果队列为空或者满的话,会让线程等待。当有元素插入时,或者拿出元素,会唤醒相应的线程。

ConcurrentSkipListMap:跳表是以空间换时间的算法。跳表分为几层,最下层是所有元素,向上的话依次为子类。从第一层开始找,所有元素比要查找元素大的话就跳到下层。跳表中有一个Index表示索引,并增加了向下和向右的索引。每层的头部还需要记录当前为第几层。

猜你喜欢

转载自blog.csdn.net/qq_38256015/article/details/80205119
今日推荐