如何用notify和notifyall解决饥饿问题?

use*_*933 2 java multithreading notify

如何用notify和解决饥饿notifyall

如果我们有4个线程,则等待获取对同一obj的锁,并且当前线程将调用 notify()

JVM将选择任何一个线程。调用的线程是否有可能notify()再次被JVM选择,就像调用之后一样notify(),它也在等待线程列表中。

如果一个线程的调用次数比其他线程的调用次数多,这可能会导致饥饿问题,除非有某种机制会首先选择等待时间最长的线程。

我在这里假设所有线程都具有相同的优先级。如果线程优先级不同,我认为最高优先级线程将在notify()

同样,notifyall()我认为我们不知道将选择哪个线程会出现同样的问题。

Dav*_*rtz 5

如果您关心哪个线程得到通知,则您做错了什么。无论需要执行什么通知,任何等待通知的线程都必须能够执行。如果此逻辑不适用于您的用例,则notify不适用于您的用例。

对线程公平性的担忧通常表示代码设计不良。确保您的代码仅能执行您真正希望的工作,并且在必要时首先执行最重要的工作是您的工作。您不应该期望调度程序以某种方式执行此操作。调度程序的工作是尽可能多地完成工作,以增强流程之间的优先级和公平性。程序员的工作是编写能正常工作的代码。