c# - 为什么这里要用锁?

标签 c# .net multithreading thread-safety locking

我目前正在阅读 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/

相关文章:

c# - 我如何计算和创建三角形的位置?

c# - MVC 中的 URL 编码 token

java - 客户端之间无法通信

multithreading - 从 QRunnable 发出信号或发布事件

c# - 取消不接受 CancellationToken 的异步操作的正确方法是什么?

c# - 许多可选过滤器可用于缩小 SQL Server 中的结果范围

c# - Blazor:创建 razor 页面返回错误: "There are no scaffolders supported for this item"

c# - 相当于 Promise.then() 的任务是什么?

c# - 为什么我收到 CS0103 错误 - ViewBag 不存在?

java - 为什么主线程等待