矢量中的竞争条件

das*_*der 2 java concurrency multithreading

1         if (!vector.contains(element))
2             vector.add(element);
Run Code Online (Sandbox Code Playgroud)

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

我不知道它是怎么发生的

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

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

小智 6

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

  1. 线程A执行contains()并获取false
  2. 线程B执行contains()并获取false
  3. 线程A执行添加并添加元素
  4. 线程B执行添加并再次添加元素

要解决此问题,您需要同步对向量的调用.如果这是调用完成的唯一区域

synchronized(vector) {
    if(!vector.contains(element))
        vector.add(element);
}
Run Code Online (Sandbox Code Playgroud)