当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-什么是线程死锁?我们该如何避免线程死锁?

金三银四精选java面试题-什么是线程死锁?我们该如何避免线程死锁?

来源:图灵教育
时间:2024-01-03 09:52:16
 

什么是线程死锁?我们该如何避免线程死锁?

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。

那么为什么会产生死锁呢?死锁的产生必须具备以下四个条件:

  • 互斥条件:指线程在占用某个资源时,会把该资源标记为已占用,并且锁住该资源,以保证同一时间内只有一个线程可以访问该资源。其他需要访问该资源的线程就只能等待该线程释放该资源,在资源被释放之后才能进行访问。
  • 请求并持有条件:指一个线程己经持有了至少一个资源,但又提出了新的资源请求,而新资源己被其它线程占有,所以当前线程会被阻塞,但阻塞的同时并不释放自己已经获取的资源
  • 不可剥夺条件:指线程获取到的资源在自己使用完之前不能被其它线程抢占,只有在自己使用完毕后才由自己释放该资源。
  • 环路等待条件:指在发生死锁时,若干线程形成头尾相接的循环等待资源关系。

该如何避免死锁呢?答案是至少破坏死锁发生的一个条件。

  • 互斥:我们没有办法破坏,因为用锁为的就是互斥。不过其他三个条件都是有办法打破的,到底如何做呢?
  • 请求并持有:可以一次性请求所有的资源。
  • 不可剥夺:设置超时时间。已经占用资源的线程进一步申请其他资源时,如果长时间申请不到,超时释放已经持有的资源。
  • 环路等待:注意加锁顺序,保证每个线程按同样的顺序进行加锁。