1         if (!vector.contains(element))
2             vector.add(element);

上面的代码不是线程安全的,因为竞争条件或复合 Action 发生在vector中。

我不知道怎么回事

如果一个线程进入第1行并获得一个锁并持有该锁,则没有其他线程可以获取该锁并调用第2行,因此竞争条件在哪里

我的理解正确吗?还是我错过了一点?
请详细解释

最佳答案

vector 是线程安全的,从某种意义上说,它的方法是线程安全的。您所拥有的是对vector的两个单独调用。这意味着存在竞赛条件问题。

  • 线程A执行contains()并获取错误的
  • 线程B执行contains()并获取错误的
  • 线程A执行添加并添加元素
  • 线程B执行添加并再次添加元素

  • 要解决此问题,您需要将调用同步到 bootstrap 。如果这是唯一可以完成通话的区域,例如
    synchronized(vector) {
        if(!vector.contains(element))
            vector.add(element);
    }
    

    关于java - Vector中的竞赛条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22109357/

    10-14 10:24
    查看更多