面试题答案
一键面试常见场景
- 共享变量读写:多个线程同时对同一个全局变量进行读写操作。例如在一个银行账户余额的模拟场景中,多个线程同时进行存款和取款操作,若没有同步机制,可能导致余额计算错误。
- 资源竞争:多个线程竞争使用同一资源,如文件的读写。如果多个线程同时尝试写入同一个文件,可能会导致文件内容混乱。
解决方法
- 锁机制(
Lock
):- 原理:
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(5):
t = threading.Thread(target = increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(counter)
在上述代码中,通过lock.acquire()
获取锁,try - finally
块确保无论操作是否成功,锁都会被释放,这样就保证了对counter
的操作是线程安全的。