import threading
# 创建两个锁
lock1 = threading.Lock()
lock2 = threading.Lock()
def thread1():
lock1.acquire()
print("Thread 1 acquired lock1")
lock2.acquire()
print("Thread 1 acquired lock2")
lock2.release()
print("Thread 1 released lock2")
lock1.release()
print("Thread 1 released lock1")
def thread2():
lock2.acquire()
print("Thread 2 acquired lock2")
lock1.acquire()
print("Thread 2 acquired lock1")
lock1.release()
print("Thread 2 released lock1")
lock2.release()
print("Thread 2 released lock2")
# 创建两个线程
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)
# 启动线程
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()
死锁产生的原因
- 资源竞争:多个线程同时竞争有限的资源,在上述代码中,
lock1
和 lock2
就是线程竞争的资源。
- 加锁顺序不一致:
thread1
先获取 lock1
再获取 lock2
,而 thread2
先获取 lock2
再获取 lock1
,这种不一致的加锁顺序就可能导致死锁。当 thread1
获取了 lock1
,thread2
获取了 lock2
时,两个线程都在等待对方释放自己需要的锁,从而陷入死循环,造成死锁。
- 持有并等待:线程在持有一个锁的情况下,还试图获取其他锁,而不释放已持有的锁,就可能导致死锁。如
thread1
持有 lock1
等待 lock2
,thread2
持有 lock2
等待 lock1
。
- 不可剥夺:线程获取到的锁在其主动释放之前,其他线程无法剥夺,这也为死锁的产生提供了条件。