2014-03-01 24 views
2
1   if (!vector.contains(element)) 
2    vector.add(element); 

上述代码不是线程安全的,因为竞争条件或复合动作发生在向量中。向量中的竞态条件

我不要;知道它是如何发生的

如果一个线程进入1号线,并得到一个锁,并持有该锁,然后其他线程可以获取锁和呼叫线路2那么,是竞争条件

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

+1

你的代码在哪里?向量不是并发结构。 –

回答

6

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

  1. 线程A执行包括(),并得到假
  2. 线程B执行包括(),并得到假
  3. 线程A执行增加,并增加你的元素
  4. 线程B执行所增加,再次增加了你的元素

要解决此问题,您需要将呼叫同步到矢量。如果这是拨打电话的唯一区域,就像

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

一旦你需要外部同步访问,最好使用非同步类型(如ArrayList或HashSet)并使用Lock或ReadWriteLock来同步所有访问。 –

+0

这是一个非常好的点Brett。此时取决于其他代码,ArrayList可能会更好。 –

+0

根据添加的对象的类型/数量,HashSet(或其他Set实现)可能是一个不错的选择,因为包含调用。 –