「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。
死锁
什么是死锁?
就是一个线程获得了一个资源的锁,而无法释放。另一个线程由于无法获得这个资源的所导致线程阻塞无法进行。
具体例子:
两个线程内拥有对方锁需要的锁
而锁的释放需要手动调用方法释放,或者等待线程执行完成后释放锁。而由于两个线程都因为缺少对方所拥有的锁而无法继续执行。
最终两个线程因为一直无法取得锁而一直阻塞。
检查死锁位置
一个任务如果出现死锁会导致阻塞,我们可以通过dump线程来查看出现死锁的位置。
如何避免死锁?
- 避免一个线程获得多个锁。
- 避免一个锁可以取得多个资源,尽量使得锁和资源是一对一的关系。
- 使用定时锁机制,使用lock.tryLock(timeout)。
- 在数据库中,保证上锁和锁的释放在同一个连接中,避免出现解锁失败。