面试题答案
一键面试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}")
在上述代码中:
- 定义了一个共享资源
counter
和一个Lock
对象lock
。 increment
函数尝试对counter
进行1000000次加1操作。在每次操作前获取锁,操作完成后释放锁。这样就确保了在同一时间只有一个线程能修改counter
,避免了资源竞争。- 创建两个线程并启动,每个线程都执行
increment
函数。 - 等待两个线程执行完毕后,输出最终的
counter
值。如果不使用锁,由于资源竞争,最终的counter
值可能会小于2000000。