嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景:线程 1 获得 A 对象的锁。线程 1 获得对象 B 的锁(同时持有对象 A 的锁)。线程 1 决定等待另一个线程的信号再继续。线程 1 调用 B.wait(),从而释放了 B 对象上的锁,但仍然持有对象 A 的锁。 线程 2 需要同时持有对象 A 和对象 B 的锁,才能向线程 1 发信号。
如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到 CPU 运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。下面是本文讨论的主题:Java 中导致饥饿的原因:高优先级线程吞噬所有的低优先级线程的 CPU 时间。
当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。如下示例:public class ImmutableValue{ private int value = 0; public ImmutableValue(int value){ this.