面试题答案
一键面试import threading
shared_list = [0] * 10
lock = threading.Lock()
def update_list(index):
global shared_list
with lock:
shared_list[index] += 1
threads = []
for i in range(len(shared_list)):
t = threading.Thread(target=update_list, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
print(shared_list)
同步机制原理
这里使用了 threading.Lock
作为同步机制。Lock
(锁)是一种基本的同步原语。当一个线程获取到锁(通过 lock.acquire()
方法,with lock
语句块内部会自动调用 acquire
方法),其他线程就无法获取该锁,直到该线程释放锁(通过 lock.release()
方法,with lock
语句块结束时会自动调用 release
方法)。这就保证了在同一时刻只有一个线程能够访问并修改共享资源 shared_list
,从而避免了数据竞争和不一致的问题。
选择原因
- 简单易用:
threading.Lock
提供了一种非常直观和简单的方式来同步线程对共享资源的访问。使用with
语句可以确保锁在代码块执行完毕后自动释放,减少了手动管理锁的复杂性和出错的可能性。 - 通用性:对于这种简单的共享资源更新场景,普通的锁机制足以满足需求。不需要引入更复杂的同步原语如信号量(Semaphore)或条件变量(Condition)等,降低了程序的复杂度。
- 效率:在这种单个共享资源且操作相对简单的情况下,
Lock
的开销相对较小,能够有效提高多线程环境下的执行效率。