如何解决竞争条件

时间:2018-02-07 12:32:40

标签: java multithreading

我有一个由2个字段和一个方法组成的测试类。

private final Lock firstLock = new ReentrantLock(true);
private final Lock secondLock = new ReentrantLock(true);

public void method() {
        firstLock.lock();
        try {
            // data transfer to the server
        } finally {
            firstLock.unlock();
        }
// race condition
        secondLock.lock();
        try {
            // read response from server
        } finally {
            secondLock.unlock();
        }
}

我有两个问题:

  1. 这种方法容易受到“种族条件”的影响? (对于一个对象,不同的线程将调用此方法,对于我来说,获取第一个锁的线程是第一个获得第二个锁的线程是必要的)。可能这是一个修辞问题。
  2. 如何避免它? (我不考虑在secondLock.lock()之前调用firstLock.unlock(),因为我的任务是创建独立的锁(第一个锁也将在另一个方法中使用,不应该依赖于第二个锁)。 / LI>

    public void method2() {
            firstLock.lock();
            try {
                // data transfer to the server (without waiting for a response from it)
            } finally {
                firstLock.unlock();
            }
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 是。您已经标记了潜在的"竞争条件"地点。 如果多个线程将尝试访问注释代码部分中的某些共享资源,则可能出现这种情况。

  2. 使用两把锁

    是不可能的
      

    我需要获得第一个锁的线程是第一个获得第二个锁的线程

  3. 换句话说,您想要创建两个依赖锁,但是:

      

    我的任务是创建独立锁