面试题答案
一键面试常见资源竞争场景
假设有多个线程对一个共享的计数器变量进行累加操作。例如,在线程1读取计数器的值后,还未进行累加并写回时,线程2也读取了该值,这样就会导致两个线程累加的结果丢失一次,最终计数器的值并非预期的多次累加后的结果。
使用threading.Lock
解决问题
threading.Lock
提供了一种简单的同步机制。线程在访问共享资源前获取锁,访问完后释放锁,这样同一时间只有一个线程能访问共享资源,避免资源竞争。
代码示例
import threading
# 共享资源
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(1000000):
# 获取锁
lock.acquire()
try:
counter = 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.acquire()
获取锁,确保同一时间只有一个线程能操作counter
,操作完成后通过lock.release()
释放锁。try - finally
语句确保无论在操作counter
过程中是否出现异常,锁都会被正确释放。