面试题答案
一键面试1. 资源竞争的定义
资源竞争指的是多个线程同时访问和修改共享资源时,由于线程执行顺序的不确定性,导致最终结果与预期不符的情况。例如多个线程同时对一个共享变量进行读写操作,由于线程调度的随机性,可能会出现数据不一致、丢失更新等问题。
2. Python中锁(Lock)机制的使用
在Python中,threading
模块提供了Lock
类来处理资源竞争问题。Lock
有两种状态:锁定(locked)和未锁定(unlocked)。线程可以通过调用acquire()
方法来获取锁,如果锁处于未锁定状态,acquire()
会将锁锁定并立即返回;如果锁已被其他线程锁定,acquire()
会阻塞当前线程,直到锁可用。线程使用完共享资源后,需要调用release()
方法释放锁,使其他线程能够获取锁并访问共享资源。
3. 数据累加场景下应用锁的示例
import threading
# 共享资源
total = 0
lock = threading.Lock()
def increment():
global total
for _ in range(1000000):
# 获取锁
lock.acquire()
try:
total += 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 total: {total}")
在上述代码中,定义了一个共享变量total
,并创建了一个锁lock
。在increment
函数中,每次对total
进行累加前,先通过lock.acquire()
获取锁,累加完成后通过finally
块中的lock.release()
释放锁,确保同一时间只有一个线程能修改total
,从而避免资源竞争。最后启动两个线程并等待它们完成,输出最终的total
值。