矢量中的竞争条件

时间:2014-03-01 02:30:02

标签: java multithreading concurrency

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

上面的代码不是线程安全的,因为种族条件或复合动作发生在向量中。

我不知道它是怎么发生的

如果一个线程进入第1行并获得一个锁并持有该锁,那么没有其他线程可以获得锁并调用第2行所以哪里是竞争条件

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

1 个答案:

答案 0 :(得分:6)

向量是线程安全的,因为它的方法是线程安全的。你有两个单独的矢量调用。这意味着竞争条件存在问题。

  1. 线程A执行contains()并获取false
  2. 线程B执行contains()并获取错误
  3. 线程A执行添加并添加元素
  4. 线程B执行添加并再次添加元素
  5. 要解决此问题,您需要同步对向量的调用。如果这是调用完成的唯一区域,如

    synchronized(vector) {
        if(!vector.contains(element))
            vector.add(element);
    }