一尘不染

Java中是否会发生虚假唤醒?

java

看到各种与锁定相关的问题,并且(几乎)总是发现“由于虚假唤醒而引起的循环” 1我想知道,有人经历过这种唤醒(例如,假设硬件/软件环境不错)吗?

我知道“虚假”一词没有明显的原因,但是发生此类事件的原因可能是什么?

(1注意:我不是在问循环练习。)

编辑:一个帮助器问题(对于那些喜欢代码示例的人):

如果我有以下程序,并且运行它:

public class Spurious {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition cond = lock.newCondition();
        lock.lock();
        try {
            try {
                cond.await();
                System.out.println("Spurious wakeup!");
            } catch (InterruptedException ex) {
                System.out.println("Just a regular interrupt.");
            }
        } finally {
            lock.unlock();
        }
    }
}

我该怎么做才能await虚假地唤醒它,而不必永远等待随机事件?


阅读 600

收藏
2020-03-11

共1个答案

一尘不染

pthread_cond_wait()Linux中的功能是使用futex系统调用实现的。EINTR当进程接收到信号时,Linux上的每个阻塞系统调用都会突然返回。… pthread_cond_wait()无法重新开始等待,因为它可能会在futex系统调用之外的短暂时间内错过一次真正的唤醒。只能通过调用方检查不变性来避免这种竞争状态。因此,POSIX信号将产生伪唤醒。

简介:如果发出Linux进程信号,则其等待线程将各自享受良好的热虚假唤醒。

2020-03-11