Java 向量中的竞争条件

Java 向量中的竞争条件,java,multithreading,concurrency,Java,Multithreading,Concurrency,上面的代码不是线程安全的,因为竞争条件或复合动作发生在vector中 我不知道;我不知道这是怎么发生的 如果一个线程到达第1行并获得锁并保持锁,那么没有其他线程可以获得锁并调用第2行,那么竞态条件在哪里 我的理解是正确的还是遗漏了一些要点? 请详细解释向量是线程安全的,因为它的方法是线程安全的。您对vector有两个单独的调用。这意味着比赛条件存在问题 线程A执行contains()并获取false 线程B执行contains()并获取false 线程A执行add并添加元素 线程B执行add并再

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

我不知道;我不知道这是怎么发生的

如果一个线程到达第1行并获得锁并保持锁,那么没有其他线程可以获得锁并调用第2行,那么竞态条件在哪里

我的理解是正确的还是遗漏了一些要点?
请详细解释向量是线程安全的,因为它的方法是线程安全的。您对vector有两个单独的调用。这意味着比赛条件存在问题

  • 线程A执行contains()并获取false
  • 线程B执行contains()并获取false
  • 线程A执行add并添加元素
  • 线程B执行add并再次添加元素
  • 要解决这个问题,您需要同步对向量的调用。如果这是唯一一个打电话的地方

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

    你的密码锁在哪里?向量不是并发结构。一旦需要外部同步访问,最好使用非同步类型(如ArrayList或HashSet)并使用锁或读写锁同步所有访问。这是一个非常好的观点。此时,根据其他代码,ArrayList可能更好。根据要添加的对象的类型/数量,HashSet(或其他一些集合实现)可能是一个不错的选择,因为有contains调用。
    synchronized(vector) {
        if(!vector.contains(element))
            vector.add(element);
    }