这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发行说明。
饥饿和活锁比死锁问题要少见得多,但仍然是每个并发软件设计者可能遇到的问题。
饥饿描述了一个线程无法定期访问共享资源并且无法取得进展的情况。当"贪婪"线程长时间地使共享资源不可用时,这种情况就会发生。例如,假设一个对象提供了一个经常需要很长时间才能返回的同步方法。如果一个线程频繁调用该方法,其他需要频繁同步访问相同对象的线程通常会被阻塞。
一个线程通常会对另一个线程的动作作出反应。如果另一个线程的动作也是对另一个线程动作的响应,那么可能会发生活锁。与死锁类似,活锁的线程无法取得进一步的进展。然而,线程并没有被阻塞 - 它们只是忙于相互响应而无法恢复工作。这就像两个人试图在走廊中相互经过:Alphonse向左移动以让Gaston通过,而Gaston向右移动以让Alphonse通过。看到他们仍然互相阻塞,Alphonse向右移动,而Gaston向左移动。他们仍然互相阻塞,所以...