从不同的线程访问带有 getter 和 setter 的 class 时是否需要锁?
Do i need locks when accessing a class with getter and setter from different threads?
我正在编写一些代码,其中一个线程正在使用来自 class 的 setters,而另一个线程正在使用来自相同 class 的 getters。
我的问题是,线程同时调用getter和setter时,是否需要使用锁或者没有问题?
锁最重要的用例是,防止线程 B、C 和 D 在线程 A 正在修改数据时看到某些共享数据集合处于不一致或无效状态。
GIL 不会阻止这种情况的发生,因为 GIL 不会阻止线程被抢先调度。
"setters" 和 "getters" 无关。关键是,您有不同的线程访问共享 变量 。如果这些变量中的任何一个与其他变量之间存在重要关系,并且更新它们的线程必须暂时打破这种关系,那么您就需要锁。没有锁,调度程序可以 "swap out" 暂时断开关系的线程,而其他线程可以看到处于 "broken" 状态的变量。
锁不会阻止调度程序在任何时刻"swapping out"任何线程,但它将阻止其他线程在第一个线程获得之前看到混乱再次运行,收拾残局,开锁。
我正在编写一些代码,其中一个线程正在使用来自 class 的 setters,而另一个线程正在使用来自相同 class 的 getters。
我的问题是,线程同时调用getter和setter时,是否需要使用锁或者没有问题?
锁最重要的用例是,防止线程 B、C 和 D 在线程 A 正在修改数据时看到某些共享数据集合处于不一致或无效状态。
GIL 不会阻止这种情况的发生,因为 GIL 不会阻止线程被抢先调度。
"setters" 和 "getters" 无关。关键是,您有不同的线程访问共享 变量 。如果这些变量中的任何一个与其他变量之间存在重要关系,并且更新它们的线程必须暂时打破这种关系,那么您就需要锁。没有锁,调度程序可以 "swap out" 暂时断开关系的线程,而其他线程可以看到处于 "broken" 状态的变量。
锁不会阻止调度程序在任何时刻"swapping out"任何线程,但它将阻止其他线程在第一个线程获得之前看到混乱再次运行,收拾残局,开锁。