Lock 互斥锁

44.5 Lock 互斥锁

多线程同时改同一变量可能数据错乱,用 Lock 保证「同一时刻只有一个线程进入临界区」。

lock.acquire() / lock.release(),推荐 with lock: 自动释放。

无锁 vs 有锁

# ========================================
# 示例:Lock 保护共享变量
# 说明:counter += 1 非原子,多线程会丢计数
# ========================================
import threading

counter = 0
lock = threading.Lock()

def add_many():
    global counter
    for _ in range(100000):
        with lock:      # 加锁,保证 += 完整执行
            counter += 1

threads = [threading.Thread(target=add_many) for _ in range(4)]
for t in threads:
    t.start()
for t in threads:
    t.join()
print('counter =', counter)  # 400000