面试题答案
一键面试验证思路
- 多变量赋值测试:在多个线程中对多个变量同时进行赋值操作。
- 线程同步:使用锁机制(如
threading.Lock
)来确保只有一个线程可以进行赋值操作,以此来对比有锁和无锁情况下的结果。 - 验证结果判断:通过检查变量赋值后的结果是否符合预期来判断多变量赋值是否具有原子性。如果在无锁情况下出现不符合预期的结果,说明多变量赋值不具有原子性。
关键代码片段
import threading
# 共享变量
a = 0
b = 0
lock = threading.Lock()
def assign_with_lock():
global a, b
with lock:
a, b = 1, 2
def assign_without_lock():
global a, b
a, b = 1, 2
# 创建线程
threads_with_lock = [threading.Thread(target=assign_with_lock) for _ in range(10)]
threads_without_lock = [threading.Thread(target=assign_without_lock) for _ in range(10)]
# 启动有锁线程
for t in threads_with_lock:
t.start()
for t in threads_with_lock:
t.join()
# 检查有锁结果
if a == 1 and b == 2:
print("有锁情况下,多变量赋值结果正确")
else:
print("有锁情况下,多变量赋值结果错误")
# 启动无锁线程
for t in threads_without_lock:
t.start()
for t in threads_without_lock:
t.join()
# 检查无锁结果
if a == 1 and b == 2:
print("无锁情况下,多变量赋值结果正确")
else:
print("无锁情况下,多变量赋值结果错误")
线程同步处理
在assign_with_lock
函数中,使用with lock:
语句来获取锁,确保在同一时间只有一个线程可以执行a, b = 1, 2
这个赋值操作。
验证结果判断
分别在有锁和无锁的多线程执行完成后,检查a
和b
的值是否为预期的1
和2
。如果值符合预期,说明多变量赋值在这种情况下表现正确;如果不符合,说明可能存在非原子性操作导致赋值结果异常。