java - 在 Java 中使用 Vector 并发崩溃

标签 java multithreading thread-safety

我认为我没有正确理解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/

相关文章:

java - Spring 验证 - NULL 或有效的 url

java - java中如何终止一个进程?

c - 在用 C 编写的 MPI 应用程序中,使用 pthread_create 来创建线程来调用函数 MPI_Finalize

c - 如何在没有全局变量的情况下使用线程实现信号量

java - 当遍历匹配突变时有效的线程安全 Java List impl

java - Java EE Web 应用程序中的无效字符串或缓冲区长度异常

java - 将文件名中的日期模式与滚动频率解耦

scala - scala.collection.mutable.Stack 的方法是线程安全的吗?

python - ThreadPoolExecutor 线程数

java - 为什么SpringApplication通过配置加载ApplicationContextInitializer?