首页 > 解决方案 > 为什么无法在 Java 中使用 if 语句构建二进制信号量

问题描述

我有一个小问题,让我有点困惑。

这是我的代码:

public synchronized void P() {
    while(!_state) {
        this.wait();
    }
    _state = false;
}

此方法负责获取信号量。为什么不能用if语句而不是while循环来构建二进制信号量?

甲骨文文档说:

首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

所以只有一个线程应该在 P() 方法内 -> 所以只有一个线程应该在 wait() 方法上被阻塞。其余线程应在 P() 方法级别上被阻止。但是当我更换它while()if()它不能正常工作

标签: javamultithreadingsemaphore

解决方案


synchronized方法相当于synchronized(this)块。

只允许 1 个线程进入同步块。通过进入它,线程获取锁。当您wait进入同步块时,您释放锁(对象监视器)并停放当前线程。此时,允许另一个线程进入该块。当其他线程将调用notifynotifyAll在被调用的同一对象上时,执行将继续wait。当给定同步块的锁将被释放时,通知线程将“退出等待状态”。

总结一下 - 等待不会像你期望的那样工作,它不会阻塞执行,只会让等待线程进入睡眠状态,允许其他线程获取同步锁。

所以你不能做你想做的事,因为wait工作方式与你期望的不同。你想在这里使用的是ReentrantLock. https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html


推荐阅读