Python类中的实例变量在不同线程中分歧
我之前在这里提到过我遇到的具体问题,但我想知道一般情况下,实例变量在多线程中是否会出现“分歧”的情况。也就是说,
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.bar
和 f.baz
,有没有可能 bar
的修改不会在 baz
中反映出来,或者反过来?
1 个回答
0
因为你使用了一个 Lock
,即使 f.baz
和 f.bar
是从两个不同的线程调用的,x
的值也不会过时。
这是因为在每个 Foo
类的实例中,同一时间只能有一个线程可以调用 baz
或 bar
。当一个方法在处理时,另一个方法不能被调用,这样就不会出现竞争条件,因为 baz
和 bar
中的读-修改-写操作都是独占进行的。