我有多个线程在一个列表上迭代。所有这些线程最终都将找到一个匹配的元素并从列表中删除。
为了避免不一致的状态,我应该为列表使用什么?向量?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);
建议:在你的情况下,使用同步映射会更有效,并且不需要循环搜索条目。