MST
星途 面试题库

面试题:Python中常用同步原语Lock的工作原理与使用

请阐述Python中`Lock`同步原语的工作原理,并举例说明如何在多线程环境中使用`Lock`来避免资源竞争。
26.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Lock同步原语的工作原理

在Python的多线程编程中,Lock(锁)是一种同步原语,用于控制对共享资源的访问。Lock有两种状态:锁定(locked)和未锁定(unlocked)。

  • 当一个线程获取(acquire)锁时,如果锁处于未锁定状态,那么该线程将锁的状态设置为锁定,并继续执行后续代码。
  • 如果锁已经处于锁定状态,那么尝试获取锁的线程会被阻塞,直到锁被其他线程释放(release),此时该线程才能获取锁并继续执行。

多线程环境中使用Lock避免资源竞争的示例

import threading

# 共享资源
counter = 0
lock = threading.Lock()


def increment():
    global counter
    for _ in range(1000000):
        # 获取锁
        lock.acquire()
        try:
            counter += 1
        finally:
            # 释放锁
            lock.release()


threads = []
for _ in range(2):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"Final counter value: {counter}")

在上述代码中:

  1. 定义了一个共享资源counter和一个Lock对象lock
  2. increment函数尝试对counter进行1000000次加1操作。在每次操作前获取锁,操作完成后释放锁。这样就确保了在同一时间只有一个线程能修改counter,避免了资源竞争。
  3. 创建两个线程并启动,每个线程都执行increment函数。
  4. 等待两个线程执行完毕后,输出最终的counter值。如果不使用锁,由于资源竞争,最终的counter值可能会小于2000000。