Java,从多个线程中删除元素



我有多个线程在一个列表上迭代。所有这些线程最终都将找到一个匹配的元素并从列表中删除。

为了避免不一致的状态,我应该为列表使用什么?向量?ArrayList吗?其他的吗?

这是一个关于向量的例子。它不会给出错误,但我相信它可以:

for(int i=0; i<timersVector.size(); i++){
    currTimerThread = timersVector.get(i);
    if(currTimerThread.getRowViewTag().equals(parent.getTag())){
        currTimerThread.stopTimer();
        timersVector.remove(i);
        Log.i(tag, "timerVector size: "+timersVector.size());
    }
}

例如,如果一个线程进入循环,大小为10,紧接着另一个线程正在删除5处的元素,第一个线程会发生什么?

感谢您的帮助

对于Vector,每个操作都是线程安全的,但多个操作则不是。当您执行多个操作时,您需要在执行所有操作时保持对集合的锁定。即在本例中是在循环之外。

。获取的元素(i)和删除的元素(i)可以被另一个线程更改。不能保证删除的元素就是选中的元素。

BTW ArrayList在1998年取代了Vector。我建议您使用它并根据需要同步和/或使用Collections.synchronizedList(new ArrayList<>())

从多个线程访问List需要一个同步的List包装器。collections实用程序类包含所有类型的同步包装器。

在你的情况下,用这行简单的代码包装你的列表(不要使用Vector,它只是向后兼容的):

List<Timer> timers = Collections.synchronizedList(originalTimers);

建议:在你的情况下,使用同步映射会更有效,并且不需要循环搜索条目。

最新更新