java - 访问不同线程上的列表的输出是什么?

标签 java multithreading synchronized

我有一个 StringArrayList,并且两个线程正在同时访问该列表。 以下代码片段的输出是什么?为什么?

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/

相关文章:

java - 在 Java 中同时运行两个类

java - 使用输入流读取器读取时缺少行

java - 为什么 Java swing 中没有将新的 Graphics 对象传递给 PaintComponent 方法?

c - gcc 内置的 __atomic 或 __sync 函数无法提供对全局变量的一致访问

c# - 线程池为什么要这样管理线程呢?

java - 此线程中的引用在哪里?

Java同步对双重检查锁定的影响?

java - 与 Java 中的 volatile 字段和同步块(synchronized block)的关系——以及它们对非 volatile 变量的影响?

java - 运行时使用的代码是否有自动突出显示

java - CSV 阅读器的危险 - Java