我知道ArrayList
未同步,但我可以同步方式访问它:
synchronized( arraylist )
{
arraylist.add( "new item" );
}
或者我可以使用vector
代替 - 我从每个博客都看到它应该避免使用。
请让我知道你的想法
答案 0 :(得分:2)
有一个并发的List
实现:CopyOnWriteArrayList
支持并发性,并且优于上述选项。
不过,我建议使用另一个集合,例如并发Queue
到BlockingQueue
,并由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
的线程安全变体,其中所有可变操作(添加,设置等)都是通过创建基础数组的新副本来实现的。
如果你执行大量写操作,第二种选择显然会占用大量内存。