Gab*_*lBB 19 java multithreading synchronization arraylist
我在dos.oracle.com找到了这个
public static List synchronizedList(列表列表)
返回由指定列表支持的同步(线程安全)列表.为了保证串行访问,必须通过返回的列表完成对后备列表的所有访问.当迭代它时,用户必须手动同步返回的列表:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么我必须同步列表来迭代它,如果Collections.synchronizedList();它应该返回已经同步的列表?
我只是在两个线程中访问列表:一个线程只添加,另一个线程获取和删除.您建议在此方案中使用哪些其他类?
谢谢阅读.
ass*_*ias 24
该列表被同步只意味着add,remove等等操作是同步的,因此原子.然而迭代不是,如果一个线程adds而另一个迭代,你可能会得到一个ConcurrentModificationException.
通过手动同步迭代块,可确保在迭代时不修改列表.
一种替代方法是使用aCopyOnWriteArrayList提供迭代器,该迭代器在迭代开始时已知的列表上迭代,而不管后续修改.但是,如果您需要经常更改列表的内容,那么该集合效率不高.
| 归档时间: |
|
| 查看次数: |
4625 次 |
| 最近记录: |