这个信号量实现有问题吗?

Is this semaphore implementation faulty?

在我当前的任务中,我们将使用信号量来同步对临界区的访问。但是,提供的实施让我质疑它是否正确实施。我希望有人能证实我的担忧。

public class Semaphore {
    private int iValue;

    public Semaphore(int piValue) {
        this.iValue = piValue;
    }

    public Semaphore() {
        this(0);
    }

    public synchronized boolean isLocked() {
        return (this.iValue <= 0);
    }

    public synchronized void P() {
        try {
            while(this.iValue <= 0) {
                wait();
            }

            this.iValue--;
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void V() {
        ++this.iValue;
        notifyAll();
    }
}

我认为这段代码中有可能出现死锁:

  1. 线程 A 调用 P() 并且 iValue 递减为 0。
  2. 线程 B 在线程 A 可以调用 V() 之前调用 P()iValue的值为0,所以进入while循环
  3. 线程 A 现在尝试调用 V(),但不能,因为线程 B 持有锁。因此,出现了死锁。

我的结论正确吗?

没有

当您 wait 锁被释放(等待结束时您会取回它)。

Javadoc for wait:

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.