我知道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 等)都是通过创建基础数组的新副本来实现的。
如果执行大量写入,第二种选择显然会更消耗内存。