我目前正在阅读C#电子书中Joe Albahari的Threading,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用了锁。例如,在这里,他锁定了对_status字段的写入和读取,_status字段是指不可变的对象。
我知道,如果ProgressStatus类是可变的,则您需要锁定读取和写入该类,因为如果在另一个线程读取状态之前更新PercentComplete和StatusMessage字段之间抢占了一个线程,则第二个线程可能获取这些字段的一对无效值。(100%完成/“操作正在进行中……”)
但是由于ProgressStatus是不可变的,因此不会出现这种无效状态。如果Joe卸下了这两个锁,可能会发生什么线程安全问题?
如果Joe卸下了这两个锁,可能会发生什么线程安全问题?
它可能导致“陈旧的数据”,读取代码可以将其缓存,并且只能看到旧值。
的这种用法lock
很典型,它的副作用是lock
:隐含的内存屏障,可防止看到旧副本。您通常会看到a,volatile ProgressStatus _status;
但volatile
也有它的问题。
没错,实际的读写操作实际上并不需要锁(访问引用是原子的)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句