我有一个 String
的 ArrayList
,并且两个线程正在同时访问该列表。
以下代码片段的输出是什么?为什么?
public static void main(String[] args) {
final ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 100; i++) {
list.add("Number" + i);
}
new Thread() {
public void run() {
for (String s : list) {
System.out.println(s);
}
}
}.start();
new Thread() {
public void run() {
list.remove("Number5");
}
}.start();
}
我尝试使用相同的代码,使用Collections.synchronizedList(list)
使Arraylist
同步。它仍然抛出java.util.ConcurrentModificationException
。
最佳答案
synchronizedList
的 Javadoc明确指出:
It is imperative that the user manually synchronize on the returned list when iterating over it:
List list = Collections.synchronizedList(new ArrayList()); ... synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
Failure to follow this advice may result in non-deterministic behavior.
由于在此代码中,您在迭代 List
时将其删除(在不同的线程中,但它是 List
的同一实例),因此将抛出ConcurrentModificationException
。
使用Collections.synchronizedList
,以下代码将正常运行。
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
for (int i = 0; i < 100; i++) {
list.add("Number" + i);
}
new Thread() {
public void run() {
synchronized (list) {
for (String s : list) {
System.out.println(s);
}
}
}
}.start();
new Thread() {
public void run() {
synchronized (list) {
list.remove("Number5");
}
}
}.start();
关于java - 访问不同线程上的列表的输出是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167162/