Java synchronized(ArrayList)还是Vector?

时间:2015-01-20 20:47:06

标签: java vector arraylist

我知道ArrayList未同步,但我可以同步方式访问它:

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

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

请让我知道你的想法

2 个答案:

答案 0 :(得分:2)

有一个并发的List实现:CopyOnWriteArrayList支持并发性,并且优于上述选项。

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

答案 1 :(得分:1)

是的,您可以使用您所描述的块来访问List并将其设为synchronized。请注意,您还必须在从列表中读取时进行同步才能完全安全。

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

备选方案1:Collections.synchronizedList

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

返回的列表将同步更新,但迭代必须仍在synchronized块中:

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

您可以找到JavaDocs here

备选方案2:CopyOnWriteArrayList:

您可以找到JavaDocs here

  

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

如果你执行大量写操作,第二种选择显然会占用大量内存。