死锁

107 阅读1分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

死锁

什么是死锁?

就是一个线程获得了一个资源的锁,而无法释放。另一个线程由于无法获得这个资源的所导致线程阻塞无法进行。

具体例子:

两个线程内拥有对方锁需要的锁

截屏2022-02-13 下午7.32.47

而锁的释放需要手动调用方法释放,或者等待线程执行完成后释放锁。而由于两个线程都因为缺少对方所拥有的锁而无法继续执行。

截屏2022-02-13 下午7.40.10

最终两个线程因为一直无法取得锁而一直阻塞。

检查死锁位置

一个任务如果出现死锁会导致阻塞,我们可以通过dump线程来查看出现死锁的位置。

如何避免死锁?

  1. 避免一个线程获得多个锁
  2. 避免一个锁可以取得多个资源,尽量使得锁和资源是一对一的关系
  3. 使用定时锁机制,使用lock.tryLock(timeout)。
  4. 在数据库中,保证上锁和锁的释放在同一个连接中,避免出现解锁失败。