java - 我很困惑——这段代码总是有效吗?

标签 java list multithreading

这段代码是我写的

public class Test{
public static void main(String[] args) {

    List<Integer> list = new ArrayList<Integer>();

    for(int i = 1;i<= 4;i++){
        new Thread(new TestTask(i, list)).start();
    }

    while(list.size() != 4){
        // this while loop required so that all threads complete their work
    }

    System.out.println("List "+list);
}

}

class TestTask implements Runnable{

private int sequence;
private List<Integer> list;

public TestTask(int sequence, List<Integer> list) {
    this.sequence = sequence;
    this.list = list;
}

@Override
public void run() {
    list.add(sequence);
}
}

这段代码可以工作并在我的机器上打印列表的所有四个元素。

我的问题是这段代码总是有效。我认为当两个/或多个线程同时将元素添加到此列表时,此代码中可能存在问题。在这种情况下, while 循环将永远不会结束,代码将失败。

有人可以建议更好的方法吗?我不太擅长多线程,不知道可以使用哪个并发集合?

谢谢谢卡尔

最佳答案

使用它可以获得真正的线程安全列表: List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());

根据您的使用情况,还有 CopyOnWriteArrayList你可能会感兴趣。准确地说,当遍历操作的数量远远超过该列表上的突变数量时。

关于java - 我很困惑——这段代码总是有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2743467/

相关文章:

multithreading - 当多个句柄同时发出信号时 WaitForMultipleObjects 的行为

java - 当前填充混合类型字节数组的最佳方法

java - 从 dom 文档创建 json

java - 如何实现Hashmap/ArrayList的列表

Java:集合

list - 列表的组合列表

java - 为什么我不能以这种方式在 for 循环中定义变量?

java - 将日期作为整数输入参数

c# - 将 Application.Current.Dispatcher 用于调度程序线程外的事件

c# - 如何在 C#(托管代码)中获取 *THREAD* 的 CPU 使用率和/或 RAM 使用率?