Java synchronized ( ArrayList ) or Vector?



我知道ArrayList没有同步,但我可以以同步的方式访问它,如下所示:

synchronized( arraylist )
{
   arraylist.add( "new item" );
}

或者我可以使用vector代替 - 我从每个博客中看到应该避免它。

请让我知道你的想法

有一个并发List实现:CopyOnWriteArrayList支持并发性,并且比上述选项更好。

不过,我还是建议使用另一个集合,例如通过BlockingQueue的并发Queue,并由LinkedBlockingQueue实现。我会要求您提供有关您的问题的更多信息,以获得更准确的帮助。

是的,您可以访问List并使用您所描述的块来synchronized。请注意,从列表中读取时还必须同步,以确保完全安全。

另一种(也是IMO更好的)方法是使用以下方法之一:

备选方案 1:集合.syncd列表:

List<SomeType> sList = Collections.synchronizedList(arrayList);
sList.add(...); // synchronized, no synchronized-block needed

返回的列表将同步以进行更新,但迭代仍必须位于synchronized块中:

// Iterating...
synchronized (sList) {
    for (SomeType s : sList) {
        // do stuff
    }
}

你可以在这里找到JavaDocs

备选方案 2:CopyOnWriteArrayList:

你可以在这里找到JavaDocs

ArrayList 的线程安全变体,其中所有可变操作(添加、set 等)都是通过创建基础数组的新副本来实现的。

如果执行大量写入,第二种选择显然会更消耗内存。

相关内容

最新更新