Python类中的实例变量在不同线程中分歧

1 投票
1 回答
566 浏览
提问于 2025-04-17 22:15

我之前在这里提到过我遇到的具体问题,但我想知道一般情况下,实例变量在多线程中是否会出现“分歧”的情况。也就是说,

class Foo:
  def __init__(self):
    self.x = 0
    self.lock = threading.Lock()

  def bar(self):
    with self.lock:
      self.x += 1

  def baz(self):
    with self.lock:
      self.x += 2

如果我创建了一个对象 f = Foo(),然后在不同的线程中调用 f.barf.baz,有没有可能 bar 的修改不会在 baz 中反映出来,或者反过来?

1 个回答

0

因为你使用了一个 Lock,即使 f.bazf.bar 是从两个不同的线程调用的,x 的值也不会过时。

这是因为在每个 Foo 类的实例中,同一时间只能有一个线程可以调用 bazbar。当一个方法在处理时,另一个方法不能被调用,这样就不会出现竞争条件,因为 bazbar 中的读-修改-写操作都是独占进行的。

撰写回答