ArrayList、Vector、LinkedList
ArrayList是非线程安全的
Vector是线程安全的
LinkedList是单线程下线程安全
然而,我们在实际的开发过程中,几乎普遍倾斜于使用ArrayList
而非Vector
,目的很明确,眼睛很雪亮,没错,ArrayList
简单、查询方便,且几乎能满足所有所需要求,那么在线程安全方面我们该如何选择呢?
-
Vector
,虽然是线程安全的,采用动态数组对象实现,但是我们查看源码会发现,其同步安全是针对其所有操作的,所以,效率会略低,故而不推荐使用。 -
LinkedList
,增、删、改 效率较高,得益于其遍历中使用的是指针,底层是双向链表结构,但线程安全只适用于单线程下。 -
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
的操作的时候加了同步,其他的操作还是要加上同步代码的操作,以免其他线程的操作引发数据脏读。
网友评论