Vector是同步的,ArrayList是不同步的但是我们可以通过Collections.synchronizedList(aList)
来同步一个ArrayList,那么哪个会更好更快呢?
最佳答案
同步收集既浪费时间又危险。为什么它们不好的一个简单例子是考虑两个线程在同一个集合上同时运行一个循环:
int i = 0;
while (i < list.size())
{
if (testSomeCondition(list.get())) {
list.remove(i);
else
i++;
}
我们的列表可以同步(例如 Vector),但这段代码仍然会严重中断。为什么?因为对 size()、get()、remove() 的各个调用是同步的,但一个线程仍可能在另一个线程迭代列表时从列表中删除项目。换句话说,我们有一个竞争条件,使用同步集合并没有给我们带来任何好处。
为了解决竞争,我们必须同步集合上的整个操作,或者使用 Java 5 并发锁来做同样的事情。
synchronized (list) {
int i = 0;
while (i < list.size())
{
if (testSomeCondition(list.get())) {
list.remove(i);
else
i++;
}
}
这个代码块现在是线程安全的,因为一次只有一个线程可以执行循环。现在没有理由使用同步集合。我们可以使用 ArrayList 而不是 Vector,这样可以避免所有这些同步调用的性能损失。
所以不要使用同步集合。如果您发现自己有多个线程访问同一个列表,那么您需要保护列表上的操作,而不是单个调用。
关于java - Vector vs Collections.synchronizedList(ArrayList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883140/