美文网首页
并发容器

并发容器

作者: 流萤飘枫 | 来源:发表于2019-07-23 11:19 被阅读0次

    1.CopyOnWriteArrayList:

    使用 CopyOnWriteArrayList 需要注意的“坑”主要有两个方面。一个是应用场景,CopyOnWriteArrayList 仅适用于写操作非常少的场景,

    而且能够容忍读写的短暂不一致。例如上面的例子中,写入的新元素并不能立刻被遍历到。

    另一个需要注意的是,CopyOnWriteArrayList 迭代器是只读的,不支持增删改。因为迭代器遍历的仅仅是一个快照,而对快照进行增删改是没有意义的。

    2.Map

    Map 接口的两个实现是 ConcurrentHashMap 和 ConcurrentSkipListMap,它们从应用的角度来看,主要区别在于

    ConcurrentHashMap 的 key 是无序的,而 ConcurrentSkipListMap 的 key 是有序的。所以如果你需要保证 key 的顺序,就只能使用 ConcurrentSkipListMap。

    使用 ConcurrentHashMap 和 ConcurrentSkipListMap 需要注意的地方是,它们的 key 和 value 都不能为空,否则会抛出NullPointerException

    这个运行时异常。下面这个表格总结了 Map 相关的实现类对于 key 和 value 的要求,你可以对比学习。

    |      集合类      |    key      |    value    | 是否线程安全 |

    | :---------------: | :----------: | :----------: | :----------: |

    |      HashMap      |  允许为NUll  |  允许为NUll  |      否      |

    |      TreeMap      | 不允许为NUll |  允许为NUll  |      否      |

    |    HashTable    | 不允许为NUll | 不允许为NUll |      是      |

    | ConCurrentHashMap | 不允许为NUll | 不允许为NUll |      是      |

    | ConCurrentSkipMap | 不允许为NUll | 不允许为NUll |      是      |

    ConcurrentSkipListMap 里面的 SkipList 本身就是一种数据结构,中文一般都翻译为“跳表”。跳表插入、删除、查询操作平均的时间复杂度是 O(log n),理论上和并发线程数没有关系,所以在并发度非常高的情况下,若你对 ConcurrentHashMap 的性能还不满意,可以尝试一下 ConcurrentSkipListMap。

    map.put()操作时CPU飙升:

    Java7中的HashMap在执行put操作时会涉及到扩容,由于扩容时链表并发操作会造成链表成环,所以可能导致cpu飙升100%。

    3.Set

    Set 接口的两个实现是 CopyOnWriteArraySet 和 ConcurrentSkipListSet,使用场景可以参考前面讲述的 CopyOnWriteArrayList 和 ConcurrentSkipListMap,它们的原理都是一样的,这里就不再赘述了。

    如何判断链表中是否存在环:

    1.首先想到的是遍历链表,寻找是否有相同地址,借此判断链表中是否有环。

    2.首先想到我们可能需要一块空间来存储指针,遍历新指针时将其和储存的旧指针比对,若有相同指针,则该链表有环,否则将这个新指针存下来后继续往下读取,直到遇见NULL,这说明这个链表无环。

    3.我们可以设置两个指针,a跑的快,b跑的慢,如果链表有环,那么当程序执行到某一状态时,a==b。如果链表没有环,程序会执行到a==NULL,结束。

    红黑树:

      红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

      性质1:每个节点要么是黑色,要么是红色。

      性质2:根节点是黑色。

      性质3:每个叶子节点(NIL)是黑色。

      性质4:每个红色结点的两个子结点一定都是黑色。

      性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

      从性质5又可以推出:

        性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点

      红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色。

        左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变

        右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。

        变色:结点的颜色由红变黑或由黑变红。

    相关文章

      网友评论

          本文标题:并发容器

          本文链接:https://www.haomeiwen.com/subject/jrkolctx.html