ArrayList如何做到线程安全?Collections.synchronizedList使用方法

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的操作的时候加了同步,其他的操作还是要加上同步代码的操作,以免其他线程的操作引发数据脏读。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。