MST

星途 面试题库

面试题:Python多线程中死锁现象的场景模拟

请用Python代码模拟一个多线程死锁的场景,并简要说明死锁产生的原因。
17.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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()

死锁产生的原因

  1. 资源竞争:多个线程同时竞争有限的资源,在上述代码中,lock1lock2 就是线程竞争的资源。
  2. 加锁顺序不一致thread1 先获取 lock1 再获取 lock2,而 thread2 先获取 lock2 再获取 lock1,这种不一致的加锁顺序就可能导致死锁。当 thread1 获取了 lock1thread2 获取了 lock2 时,两个线程都在等待对方释放自己需要的锁,从而陷入死循环,造成死锁。
  3. 持有并等待:线程在持有一个锁的情况下,还试图获取其他锁,而不释放已持有的锁,就可能导致死锁。如 thread1 持有 lock1 等待 lock2thread2 持有 lock2 等待 lock1
  4. 不可剥夺:线程获取到的锁在其主动释放之前,其他线程无法剥夺,这也为死锁的产生提供了条件。