面试题答案
一键面试可能出现的问题
在多线程环境下同时修改类属性,可能会出现数据竞争问题。由于多个线程可能同时访问和修改类属性,导致最终的结果可能不是预期的,出现数据不一致、结果不可预测等情况。例如,两个线程同时读取类属性的值,各自进行修改后再写回,可能会覆盖掉对方的修改,丢失更新。
同步机制及代码示例
可以使用threading.Lock
来解决这个问题,确保同一时间只有一个线程能够修改类属性。以下是代码示例:
import threading
class SharedClass:
shared_attribute = 0
lock = threading.Lock()
def update_attribute(self, increment):
with self.lock:
self.shared_attribute += increment
def worker(shared_obj, increment):
for _ in range(1000):
shared_obj.update_attribute(increment)
if __name__ == "__main__":
shared = SharedClass()
thread1 = threading.Thread(target=worker, args=(shared, 1))
thread2 = threading.Thread(target=worker, args=(shared, 2))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(f"Final value of shared_attribute: {shared.shared_attribute}")
在上述代码中:
- 定义了一个
SharedClass
类,包含一个类属性shared_attribute
和一个threading.Lock
对象lock
。 update_attribute
方法使用with
语句来获取锁,这样在进入代码块时自动获取锁,离开代码块时自动释放锁,确保在修改shared_attribute
时不会有其他线程同时进行修改。worker
函数模拟了线程的工作,多次调用update_attribute
方法。- 最后创建两个线程并启动,等待它们执行完毕后打印最终的
shared_attribute
值。这样通过锁机制,保证了类属性在多线程环境下修改的安全性。