美文网首页
ArrayList如何做到线程安全?Collections.sy

ArrayList如何做到线程安全?Collections.sy

作者: 大川的川 | 来源:发表于2020-07-06 17:53 被阅读0次

    ArrayList、Vector、LinkedList

    ArrayList是非线程安全的
    Vector是线程安全的
    LinkedList是单线程下线程安全

    然而,我们在实际的开发过程中,几乎普遍倾斜于使用ArrayList而非Vector,目的很明确,眼睛很雪亮,没错,ArrayList简单、查询方便,且几乎能满足所有所需要求,那么在线程安全方面我们该如何选择呢?

    1. Vector,虽然是线程安全的,采用动态数组对象实现,但是我们查看源码会发现,其同步安全是针对其所有操作的,所以,效率会略低,故而不推荐使用。
    2. LinkedList,增、删、改 效率较高,得益于其遍历中使用的是指针,底层是双向链表结构,但线程安全只适用于单线程下。
    3. ArrayList,get和set的时候效率较高,采用动态数组对象实现,有序有索引,非线程安全

    如果我们要做线程安全的集合数据,那我们可以选择LinkedList和ArrayList,

    • 线程安全ArrayList:List<String> list = Collections.synchronizedList(new ArrayList());
    • 线程安全LinkedList:List<String> list = Collections.synchronizedList(new LinkedList());
      示例代码:
    list.add("1");
    list.add("2");
    list.add("3");
    synchronized (list) {
        Iterator i = list.iterator(); // Must be in synchronized block
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }
    

    看到这里,我们可能要想了,为什么我加了线程安全的封装代码,怎么遍历的时候还需要同步代码块的存在呢?因为Collections.synchronizedList只是对集合add的操作的时候加了同步,其他的操作还是要加上同步代码的操作,以免其他线程的操作引发数据脏读。

    相关文章

      网友评论

          本文标题:ArrayList如何做到线程安全?Collections.sy

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