MST

星途 面试题库

面试题:Python类属性值修改的多线程场景处理

假设在一个多线程环境中,有一个Python类,其类属性需要被多个线程同时修改。请描述可能会出现的问题,并给出使用合适的同步机制来安全修改类属性值的代码示例。
13.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

在多线程环境下同时修改类属性,可能会出现数据竞争问题。由于多个线程可能同时访问和修改类属性,导致最终的结果可能不是预期的,出现数据不一致、结果不可预测等情况。例如,两个线程同时读取类属性的值,各自进行修改后再写回,可能会覆盖掉对方的修改,丢失更新。

同步机制及代码示例

可以使用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}")

在上述代码中:

  1. 定义了一个SharedClass类,包含一个类属性shared_attribute和一个threading.Lock对象lock
  2. update_attribute方法使用with语句来获取锁,这样在进入代码块时自动获取锁,离开代码块时自动释放锁,确保在修改shared_attribute时不会有其他线程同时进行修改。
  3. worker函数模拟了线程的工作,多次调用update_attribute方法。
  4. 最后创建两个线程并启动,等待它们执行完毕后打印最终的shared_attribute值。这样通过锁机制,保证了类属性在多线程环境下修改的安全性。