【发布时间】:2011-11-12 06:03:14
【问题描述】:
有关 synchronizedList 的文档指出,
用户在迭代返回的列表时必须手动同步它:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
不遵循此建议可能会导致不确定的行为。
这似乎很清楚,但我只是想确认一个 for each 循环是被禁止的。例如,我不能做如下的事情吗?
List<MyType> list = Collections.synchronizedList(new ArrayList(<MyType>));
...
synchronized(list){
for(MyType m : list){
foo(m);
m.doSomething();
}
}
【问题讨论】:
-
为什么会被禁止?生成的字节码几乎相同。 Foreach 使用迭代器...
-
貌似synchronizedList只是用synchronized修饰了方法调用,但有局限性。也许设计者也应该装饰迭代器方法,并返回一个同步的迭代器。 for 是语言上的,不能这么容易修饰 XD:
-
检查此链接programmerzdojo.com/java-tutorials/… 它可能会有所帮助
标签: java list collections for-loop synchronized