嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景:线程 1 获得 A 对象的锁。线程 1 获得对象 B 的锁(同时持有对象 A 的锁)。线程 1 决定等待另一个线程的信号再继续。线程 1 调用 B.wait(),从而释放了 B 对象上的锁,但仍然持有对象 A 的锁。 线程 2 需要同时持有对象 A 和对象 B 的锁,才能向线程 1 发信号。
如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到 CPU 运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。下面是本文讨论的主题:Java 中导致饥饿的原因:高优先级线程吞噬所有的低优先级线程的 CPU 时间。