如何使 ArrayList 线程安全?Java中问题的另一种方法?

我有一个 ArrayList,我想用它来保存 RaceCar 对象,这些对象在执行完成后立即扩展 Thread 类。一个名为 Race 的类使用回调方法处理此 ArrayList,RaceCar 对象在执行完成后调用该方法。回调方法 addFinisher(RaceCar finisher) 将 RaceCar 对象添加到 ArrayList 中。这应该给出线程完成执行的顺序。

我知道ArrayList不是同步的,因此不是线程安全的。我尝试使用 Collections.synchronizedCollection(c Collection) 方法,方法是传入新的 ArrayList 并将返回的集合分配给 ArrayList。但是,这给了我一个编译器错误:

Race.java:41: incompatible types
found   : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));

以下是相关代码:

public class Race implements RaceListener {
    private Thread[] racers;
    private ArrayList finishingOrder;

    //Make an ArrayList to hold RaceCar objects to determine winners
    finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));

    //Fill array with RaceCar objects
    for(int i=0; i<numberOfRaceCars; i++) {
    racers[i] = new RaceCar(laps, inputs[i]);

        //Add this as a RaceListener to each RaceCar
        ((RaceCar) racers[i]).addRaceListener(this);
    }

    //Implement the one method in the RaceListener interface
    public void addFinisher(RaceCar finisher) {
        finishingOrder.add(finisher);
    }

我需要知道的是,我是否使用了正确的方法,如果没有,我应该使用什么来使我的代码线程安全?感谢您的帮助!


答案 1

使用 Collections.synchronizedList()

前任:

Collections.synchronizedList(new ArrayList<YourClassNameHere>())

答案 2

改变

private ArrayList finishingOrder;

//Make an ArrayList to hold RaceCar objects to determine winners
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)

private List finishingOrder;

//Make an ArrayList to hold RaceCar objects to determine winners
finishingOrder = Collections.synchronizedList(new ArrayList(numberOfRaceCars)

List 是 ArrayList 的超类型,因此您需要指定它。

否则,你正在做的事情似乎很好。另一种选择是您可以使用矢量,它是同步的,但这可能是我会做的。