我认为我没有正确理解Java中Vector同步的含义。 在我的代码中,一些线程正在运行修改我的 vector 的指令,例如调用 mVector.addAll(anothervector)。但是当使用以下代码交互 vector 时,我的应用程序崩溃了:
// the vector declaration
Vector<myClass> mVector = new Vector<myClass>;
// the method that crashes
public void printVector(){
for (myClass mObject: mVector){
System.out.println(mObject);
}
}
如果 Vector 对象是同步的,为什么会崩溃?我该如何解决这个问题?提前致谢
最佳答案
您没有具体说明“崩溃”的含义,但如果您收到 ConcurrentModificationException
,则意味着另一个线程在 for-each 循环内修改了您的列表。
此异常本身并不表示同步问题,因为它可以在单个线程中复制(只需尝试在迭代列表时将元素添加到列表中)。相反,当集合的结构在迭代过程中被修改时,就会抛出该异常。 Iterator
是有状态的;在使用时修改集合会导致非常严重的错误,因此运行时会防止它。
要解决这个问题,您可以将 for 循环包装在同步块(synchronized block)中:
synchronized (mVector) {
for (... ) {
}
}
关于java - 在 Java 中使用 Vector 并发崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7136840/