1 if (!vector.contains(element))
2 vector.add(element);
上面的代码不是线程安全的,因为种族条件或复合动作发生在向量中。
我不知道它是怎么发生的
如果一个线程进入第1行并获得一个锁并持有该锁,那么没有其他线程可以获得锁并调用第2行所以哪里是竞争条件
我的理解是正确的还是我错过了一些观点? 请详细解释
答案 0 :(得分:6)
向量是线程安全的,因为它的方法是线程安全的。你有两个单独的矢量调用。这意味着竞争条件存在问题。
要解决此问题,您需要同步对向量的调用。如果这是调用完成的唯一区域,如
synchronized(vector) {
if(!vector.contains(element))
vector.add(element);
}