我目前正在阅读 Joe Albahari 的 Threading in C#电子书,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用锁。 Here ,例如,他锁定了对 _status 字段的写入和读取,该字段指的是一个不可变对象(immutable对象)。
我知道如果 ProgressStatus 类是可变的,您将需要锁定读取和写入它,因为如果一个线程在更新 PercentComplete 和 StatusMessage 字段之间被抢占另一个线程读取状态,第二个线程可能会得到这些字段的一对无效值。 (100% 完成/“正在进行操作...”)
但由于 ProgressStatus 是不可变的,因此不会出现此类无效状态。如果 Joe 删除了这两个锁,会出现什么线程安全问题?
最佳答案
If Joe removed both of those locks, what thread safety issue could arise?
它可能导致“陈旧数据”,读取代码可以缓存它并且只能看到旧值。
lock
的这种用法是非典型的,它利用了 lock
的副作用:它有一个隐含的内存屏障,可以防止看到一个旧副本。您通常会看到 volatile ProgressStatus _status;
,但 volatile
也有其问题。
你是对的,实际的读写操作在这里并不真的需要锁(访问引用是原子的)。
关于c# - 为什么这里要用锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584985/