面试题答案
一键面试资源竞争
- 产生原因:多个线程同时访问和修改共享资源,由于线程执行的随机性,可能导致数据不一致等问题。例如多个线程同时对一个共享变量进行读写操作。
- 处理方式:
- 互斥锁(Mutex):通过互斥锁来保证同一时间只有一个线程能访问共享资源。线程在访问资源前先获取锁,访问完后释放锁。
- 读写锁(Read - Write Lock):允许多个线程同时读共享资源,但只允许一个线程写。读操作时获取读锁,写操作时获取写锁。
死锁
- 产生原因:两个或多个线程互相持有对方需要的资源,同时又在等待对方释放自己需要的资源,从而形成一种僵持状态。例如线程A持有资源1,等待资源2,而线程B持有资源2,等待资源1。
- 处理方式:
- 避免死锁的产生:
- 破坏死锁的四个必要条件:破坏互斥条件(尽量不使用独占资源)、占有并等待条件(一次性获取所有需要的资源)、不可剥夺条件(允许剥夺资源)、循环等待条件(对资源进行排序,按序获取)。
- 资源分配图算法:如银行家算法,在每次分配资源前检查是否会导致死锁,如果会则不分配。
- 检测与恢复:
- 死锁检测算法:定期检查系统中是否存在死锁。例如通过资源分配图算法检测死锁。
- 死锁恢复:一旦检测到死锁,可通过终止一个或多个死锁线程、剥夺死锁线程的资源等方式来打破死锁。
- 避免死锁的产生:
线程饥饿
- 产生原因:某个线程由于优先级过低,或者其他高优先级线程持续占用资源,导致该线程长时间无法获得执行机会。
- 处理方式:
- 调整线程优先级:合理设置线程优先级,避免某些线程优先级过高或过低。
- 公平调度算法:采用公平调度策略,确保每个线程都有机会执行,如时间片轮转调度算法。
线程过早退出
- 产生原因:线程在执行过程中遇到未处理的异常,或者外部调用提前终止线程等。
- 处理方式:
- 异常处理:在线程的执行方法中使用try - catch块捕获异常,进行适当处理,避免线程因异常而意外终止。
- 优雅终止:提供外部控制线程终止的方法,线程内部通过检查标志位等方式,在合适的时机终止,而不是被强制终止。