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

She*_*har 0 java multithreading list

我写了这段代码

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);
}
}
Run Code Online (Sandbox Code Playgroud)

此代码在我的机器上工作并打印列表的所有四个元素.

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

任何人都可以提出更好的方法吗?我不擅长多线程,不知道我可以使用哪个并发集合?

谢谢,谢卡尔

b_e*_*erb 5

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

根据您的使用情况,您也CopyOnWriteArrayList可能感兴趣.确切地说,当遍历操作大大超过该列表中的突变时.