Java多线程面试:死锁及其预防措施

Answered using GPT-4o-mini by Java Q&A Hub

Question:

Java面试题之多线程 什么是死锁(Deadlock)?

Answer:

死锁(Deadlock)是指两个或多个线程在执行过程中,因为争夺资源而造成的一种互相等待的状态。具体来说,死锁发生在以下四个条件同时满足时:

  1. 互斥条件:至少有一个资源是以非共享的方式分配的,即某个资源一次只能被一个线程使用。如果其他线程请求该资源,请求线程必须等待。

  2. 占有且等待条件:至少有一个线程持有一个资源,并且正在等待获取其他线程持有的资源。

  3. 不剥夺条件:已经分配给线程的资源,在未使用完之前,不能被其他线程强行剥夺。

  4. 循环等待条件:存在一种线程资源的循环等待关系,即线程A等待线程B持有的资源,线程B等待线程C持有的资源,线程C又等待线程A持有的资源。

示例

假设有两个线程,线程1和线程2,它们分别持有资源A和资源B:

  • 线程1持有资源A,并请求资源B。
  • 线程2持有资源B,并请求资源A。

在这种情况下,线程1和线程2都在等待对方释放资源,导致它们都无法继续执行,从而形成死锁。

如何避免死锁

  1. 资源有序分配:对所有资源进行编号,线程在请求资源时,按照编号顺序请求资源,避免循环等待。

  2. 请求资源时的超时机制:线程在请求资源时设置超时时间,如果在规定时间内未能获得资源,则放弃当前持有的资源,重新尝试。

  3. 避免占有且等待:在请求资源之前,线程先释放自己持有的资源,然后再请求其他资源。

  4. 使用死锁检测算法:定期检查系统中是否存在死锁,如果发现死锁,则采取措施(如终止某个线程)来解除死锁。

理解死锁的概念及其预防措施对于编写高效且可靠的多线程程序至关重要。