我目前正在阅读Joe Albahari的Threading in C#电子书,有时在他的示例代码中,他会在我看不到任何线程安全问题的地方使用锁。例如这里,他在写入和读取与不可变对象相关的_status字段时进行了锁定。
我理解如果ProgressStatus类是可变的,您需要在读取和写入它时加锁,因为如果一个线程在更新PercentComplete和StatusMessage字段之间被另一个线程读取状态抢占,第二个线程可能会得到这些字段的无效值对。(100%完成/“操作正在进行中…”)
但由于ProgressStatus是不可变的,不会出现这种无效状态。如果Joe删除了这两个锁,会出现什么线程安全问题?
我理解如果ProgressStatus类是可变的,您需要在读取和写入它时加锁,因为如果一个线程在更新PercentComplete和StatusMessage字段之间被另一个线程读取状态抢占,第二个线程可能会得到这些字段的无效值对。(100%完成/“操作正在进行中…”)
但由于ProgressStatus是不可变的,不会出现这种无效状态。如果Joe删除了这两个锁,会出现什么线程安全问题?