面试题答案
一键面试死锁产生的常见原因
- 资源竞争:多个线程同时竞争有限的资源,并且对资源的获取顺序不一致。例如,线程A获取资源1后尝试获取资源2,而线程B获取资源2后尝试获取资源1,如果两个线程都不释放已获取的资源,就会形成死锁。
- 循环依赖:线程之间形成了资源获取的循环链条。比如线程A等待线程B释放资源,线程B等待线程C释放资源,而线程C又等待线程A释放资源,从而陷入死循环。
代码示例
import threading
# 创建两个锁
lock1 = threading.Lock()
lock2 = threading.Lock()
def thread1():
lock1.acquire()
print('线程1获取了锁1')
lock2.acquire()
print('线程1获取了锁2')
lock2.release()
print('线程1释放了锁2')
lock1.release()
print('线程1释放了锁1')
def thread2():
lock2.acquire()
print('线程2获取了锁2')
lock1.acquire()
print('线程2获取了锁1')
lock1.release()
print('线程2释放了锁1')
lock2.release()
print('线程2释放了锁2')
# 创建两个线程
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)
# 启动线程
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()
在上述代码中,thread1
先获取lock1
,再获取lock2
,而thread2
先获取lock2
,再获取lock1
。如果thread1
获取了lock1
,同时thread2
获取了lock2
,此时两个线程都在等待对方释放锁,就会导致死锁。