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# 更新 SSRS 2012 部署的数据源和数据集引用

.NET REGEX 仅获取整数,排除整数小数

c++ - cpp 简单线程程序在退出时崩溃

python - 如何将线程局部变量与 ThreadPoolExecutor 一起使用?

c# - 如何检查丹麦服务器上的小数边界

c# - 如何确定一个对象是否实现了任何类型的 IDictionary 或 IList

c# - 如何通过套接字发送大的 xml 文件

c# - 如何计算 WCF 服务器发送到客户端的消息流的大小

c# - Dotfuscator 是如何工作的?

c++ - 如何正确地将参数传递给 pthread