虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却差别不大。换句话说,它们内部的的基础部分是相同(或相似)的。了解这些基础部件能在设计同步器的时候给我们大大的帮助。这就是本文要细说的内容。注:本文的内容是哥本哈根信息技术大学一个由 Jakob Jenkov,Toke Johansen 和 Lars Bjørn 参与的 M.Sc.学生项目的部分成果。
嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景:线程 1 获得 A 对象的锁。线程 1 获得对象 B 的锁(同时持有对象 A 的锁)。线程 1 决定等待另一个线程的信号再继续。线程 1 调用 B.wait(),从而释放了 B 对象上的锁,但仍然持有对象 A 的锁。 线程 2 需要同时持有对象 A 和对象 B 的锁,才能向线程 1 发信号。
如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到 CPU 运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。下面是本文讨论的主题:Java 中导致饥饿的原因:高优先级线程吞噬所有的低优先级线程的 CPU 时间。