如果我有T1 T2 T3所有已经调用wait并且在waitset中,如果t4调用notify,据我所知 - T1,T2或T3中的一个将被通知并且可能重新获取锁并从等待返回。 没有收到通知的线程会发生什么?他们还会参加等待吗? 是否必须再次通知他们从wait()返回?
如果T4呼叫全部通知,则获取锁定后,t1 T2 T3中只有一个将从等待返回。在这种情况下,由于所有的T1T2和T3都收到了通知,它们是否会自动尝试获取锁并逐个从等待返回?
答案 0 :(得分:3)
线程进入RUNNABLE而不是RUNNING状态。这意味着notify()一个线程并不一定意味着它会立即运行。因此,由调度程序决定从RUNNABLE线程池中接下来要运行的是什么。
答案 1 :(得分:2)
对于notify()
,其他主题仍将等待另一个notify()
来电。
对于notifyAll()
,其他线程将只等待获取锁定,一次一个 - 不再需要notify
个调用。 (当然,他们需要等待通知线程首先释放锁。)
答案 2 :(得分:2)
未收到通知的线程会发生什么?他们还会参加等待吗?是否必须再次通知他们从wait()返回?
是的,他们仍在等待中。必须将通知发送到每个等待的线程。收到通知后,等待的线程将尝试重新获取锁
如果T4呼叫全部通知,则获取锁定后,t1 T2 T3中只有一个将从等待返回。在这种情况下,由于所有的T1T2和T3都收到了通知,它们是否会自动尝试获取锁并逐个从等待返回?
不保证T1,T2和T3将对通知信号起作用。但是,是的,所有人都会尝试同时重新获得锁定(只有一个会成功并从等待通话中返回)
确保在等待线程从wait()调用返回后,将wait等待在while循环中以重新检查条件。
这个link很好地概述了何时使用notify()/ notifyAll()
答案 3 :(得分:0)
当一个线程执行notify()时,另一个线程在释放它之前无法获取该锁。在你想唤醒所有线程时使用notifyAll()。
无论你在做什么,我建议你确保在你尝试编写低级等待/通知代码之前,Java中的Concurrency Library已经为你做了。