面试题答案
一键面试常见场景1:循环等待资源
- 场景描述:多个线程按不同顺序请求多个资源,形成循环等待的情况。例如,线程A持有资源R1并请求资源R2,线程B持有资源R2并请求资源R1,此时两个线程相互等待对方释放资源,从而导致死锁。
- 避免策略:
- 资源分配图算法:使用资源分配图算法(如银行家算法)来检测和避免死锁。通过对资源请求和分配状态进行监控和评估,确保每次资源分配都不会导致系统进入不安全状态。
- 资源排序:为所有资源分配一个唯一的序号,线程请求资源时按照序号从小到大的顺序进行请求。这样可以避免循环等待资源的情况发生。
常见场景2:锁嵌套使用不当
- 场景描述:一个线程在持有一把锁的情况下,又尝试获取另一把锁,而另一个线程以相反的顺序获取这两把锁。例如,线程1先获取锁L1,然后尝试获取锁L2;线程2先获取锁L2,然后尝试获取锁L1,最终导致死锁。
- 避免策略:
- 减少锁嵌套:尽量减少锁的嵌套使用,将需要锁保护的代码逻辑简化,避免不必要的锁嵌套层次。
- 统一加锁顺序:制定一个统一的加锁顺序规则,所有线程都按照这个顺序获取锁。例如,在整个程序中规定先获取锁L1,再获取锁L2,无论在何种情况下都遵循这个顺序。