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

Seg*_*las 1 java collections thread-safety

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

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

这是一个使用Vectors的例子.它不会出错,但我确信它可以:

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

例如,如果一个线程正在进入循环并且大小为10并且正好在另一个线程在5处移除元素之后,那么第一个线程会发生什么?

谢谢你的帮助

Pet*_*rey 5

对于Vector,每个操作都是线程安全的,但是多个操作不是.当您执行多个操作时,您需要在执行所有操作时锁定集合.即在这种情况下在循环之外.

例如你得到的元素(i)和你删除的元素(i)可以被另一个线程改变.无法保证您删除的元素是您选中的元素.

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