dgm*_*ulf 5 .net c# multithreading locking thread-safety
我目前正在阅读Joe Albahari 在C#电子书中的线程,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用锁.例如,在这里,他锁定了对_status字段的写入和读取,该字段引用了一个不可变对象.
我理解如果ProgressStatus类是可变的,你需要锁定读取和写入它,因为如果一个线程被另一个读取状态的线程更新PercentComplete和StatusMessage字段之间的预占,第二个线程可能获取这些字段的无效值对.(100%完成/"正在进行中......")
但由于ProgressStatus是不可变的,因此不会出现这种无效状态.如果Joe删除了这两个锁,可能会出现什么线程安全问题?
如果 Joe 删除了这两个锁,会出现什么线程安全问题?
它可能会导致“陈旧数据”,读取代码可以缓存它并且只能看到旧值。
的这种用法lock是非典型的,它受益于 的副作用lock:它具有隐含的内存屏障,并且可以防止看到旧副本。您通常会看到 avolatile ProgressStatus _status;但volatile也有其问题。
您是对的,实际的读写操作实际上并不需要锁(访问引用是原子的)。
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |