Java 此代码是否具有竞争条件?

Java 此代码是否具有竞争条件?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我知道Vector在java中是线程安全的 但这种情况会发生吗 假设在本例中,has list.size()=10 线程A在第2行调用deleteLast和lastIndex=9。由于某种原因,它会停止 线程B调用deleteLast并在第2行lastIndex=9。它转到第3行,现在列表有9个元素 线程A现在唤醒并转到第3行,现在它尝试删除索引9中不存在的对象,这里有一个异常确定。您已经正确识别了竞争条件。是的,它可以。您应该使用列表而不是列表来避免这种情况。是!!由于有这么多集合是线程安全的

我知道Vector在java中是线程安全的 但这种情况会发生吗

假设在本例中,has list.size()=10

线程A在第2行调用deleteLast和lastIndex=9。由于某种原因,它会停止

线程B调用deleteLast并在第2行lastIndex=9。它转到第3行,现在列表有9个元素


线程A现在唤醒并转到第3行,现在它尝试删除索引9中不存在的对象,这里有一个异常

确定。您已经正确识别了竞争条件。

是的,它可以。您应该使用列表而不是
列表来避免这种情况。

是!!由于有这么多集合是线程安全的,但对于某些实例,您的代码需要额外的线程安全性仅供参考,“竞争条件”与“并发缺陷”不同。您的示例有一个您已正确识别的缺陷。“竞争条件”通常意味着结果取决于哪个线程首先执行特定语句。除非其中一个可能的结果是“错误的”(例如,
ArrayIndexOutOfBoundsException
),否则竞争条件不是缺陷。您的示例抛出了该异常,但我认为它比单纯的竞争条件更复杂,因为问题案例是几个语句的特殊交错,而不仅仅是哪个线程先到达第3行的问题。
    public static void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;//line 2
    list.remove(lastIndex);         // line 3
}