sub*_*his 36 java collections vector arraylist
Vector是同步的,ArrayList不是同步的,但是我们可以同步一个ArrayList Collections.synchronizedList(aList),这样会更好更快地执行吗?
同步收集既浪费时间又危险。一个很简单的例子,为什么它们不好,是考虑两个线程在同一集合上同时运行一个循环:
int i = 0;
while (i < list.size())
{
if (testSomeCondition(list.get())) {
list.remove(i);
else
i++;
}
Run Code Online (Sandbox Code Playgroud)
我们的列表可能是同步的(例如,Vector),并且此代码仍将严重破坏。为什么?因为对size(),get(),remove()的单个调用是同步的,但是一个线程仍可以从列表中删除项目,而另一个线程对其进行迭代。换句话说,我们有一个竞争条件,使用同步集合并没有给我们带来任何好处。
为了解决这个问题,我们必须同步集合上的整个操作,或者使用Java 5并发锁来做到这一点。
synchronized (list) {
int i = 0;
while (i < list.size())
{
if (testSomeCondition(list.get())) {
list.remove(i);
else
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,此代码块是线程安全的,因为一次只能有一个线程可以执行循环。现在,没有理由使用同步集合。我们可以使用ArrayList代替Vector,并节省所有同步调用的性能损失。
因此,请勿使用同步集合。如果发现自己有多个线程在同一个列表中,则需要保护列表中的操作,而不是单个调用。