在线程调用之后通知发生了什么



如果我有T1 T2 T3都调用了wait并且在waitset中,如果t4调用notify,正如我所理解的那样- T1,T2或T3中的一个将被通知,并可能重新获得锁并从等待中返回。没有收到通知的线程会发生什么?他们还会在等候区吗?是否必须再次通知它们才能从wait()返回?

如果T4调用notify all,在获得锁后,只有t1 T2 T3中的一个会从wait返回。在这种情况下,由于所有T1T2和T3都收到了notify,它们是否会自动尝试获取锁并逐个从wait返回?

线程处于RUNNABLE状态,而不是RUNNING状态。这意味着使用notify()方法处理线程并不一定意味着它将立即运行。因此,由调度器来决定下一步将在RUNNABLE线程池中运行什么。

对于notify(),其他线程仍将等待另一个notify()调用。

对于notifyAll(),其他线程将只是等待获取锁,一次一个-不需要更多的notify调用。(当然,它们需要等待发出通知的线程先释放锁。)

没有收到通知的线程会发生什么?他们还会在等候区吗?是否必须再次通知它们才能从wait()返回?

是的,它们仍然在等待集中。必须向每个等待线程发送通知。收到通知后,等待线程将尝试重新获取锁

如果T4调用notify all,在获得锁后,只有t1 T2 T3中的一个会从wait返回。在这种情况下,由于所有的T1T2和T3都收到了notify,它们会自动尝试获取锁并依次从wait返回吗?

不能保证T1、T2、T3作用于通知信号的先后顺序。但是,是的,它们都将同时尝试重新获取锁(只有一个将成功并从等待调用返回)

确保将wait放入while循环中,以便在等待线程从wait()调用返回后重新检查条件。

这个链接很好地概述了何时使用notify()/notifyAll()

当一个线程执行notify()时,另一个线程在释放锁之前无法获得锁。如果你想唤醒所有线程,可以使用notifyAll()。

无论你在做什么,我建议你确保Java中的并发库在你尝试编写低级等待/通知代码之前已经为你做了。

最新更新