Discuss / Java / 廖老师你好,关于notifly唤醒问题。

廖老师你好,关于notifly唤醒问题。

Topic source

咕咕111111

#1 Created at ... [Delete] [Delete and Lock User]

notify唤醒线程,处于notify临界区得锁是否在notify这里释放,还是在这个临界区代码执行完释放?

但是,注意到wait()方法返回时需要重新获得this锁。假设当前有3个线程被唤醒,唤醒后,首先要等待执行**addTask()的线程结束此方法后,才能释放this**,随后,这3个线程中只能有一个获取到this锁,剩下两个将继续等待。

刘宇1

#3 Created at ... [Delete] [Delete and Lock User]

notify 唤醒线程,只是随机唤醒一个正在this锁等待的线程,此时还没有释放锁,正在this锁等待的线程无法获得锁,无法从 `wait()` 方法返回。要等 执行**addTask()的线程结束此方法后,才能释放this**锁。释放锁之后。**被唤醒的那个线程才能获得锁。

独家记忆

#4 Created at ... [Delete] [Delete and Lock User]

这个底层原理应该是:wait()调用操作系统的pthread_cond_wait()系统调用,这个函数在等待时,可能会接受到信号或者中断而跳出函数,这时候程序继续向下执行不符合我们的本意,因为还没有达到条件,因为跳出了if。而使用while,则限定了跳出的条件,即必须达到我们要求的条件才不会继续陷入等待。这个问题叫做“虚假唤醒”,顾名思义,还没有达到条件而由于其他情况被唤醒。


  • 1

Reply