为什么在这里使用锁?

硫丹

我目前正在阅读C#电子书中Joe Albahari的Threading,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用了锁。例如,在这里,他锁定了对_status字段的写入和读取,_status字段是指不可变的对象。

我知道,如果ProgressStatus类是可变的,则您需要锁定读取和写入该类,因为如果在另一个线程读取状态之前更新PercentComplete和StatusMessage字段之间抢占了一个线程,则第二个线程可能获取这些字段的一对无效值。(100%完成/“操作正在进行中……”)

但是由于ProgressStatus是不可变的,因此不会出现这种无效状态。如果Joe卸下了这两个锁,可能会发生什么线程安全问题?

亨克·霍尔特曼

如果Joe卸下了这两个锁,可能会发生什么线程安全问题?

它可能导致“陈旧的数据”,读取代码可以将其缓存,并且只能看到旧值。

的这种用法lock很典型,它的副作用是lock:隐含的内存屏障,可防止看到旧副本。您通常会看到a,volatile ProgressStatus _status;volatile也有它的问题。

没错,实际的读写操作实际上并不需要锁(访问引用是原子的)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在这里需要锁?

来自分类Java

为什么使用原子在这里?

来自分类Java

为什么在这里使用克隆?

来自分类Linux

为什么在这里使用进程替换导致挂起?

来自分类Dev

为什么在这里使用额外的let语句?

来自分类Mysql

为什么我在这里通过使用组?

来自分类Dev

Javascript:为什么在这里使用 preventDefault?

来自分类Dev

为什么在这里使用git裸仓库?

来自分类Java

为什么在这里使用按位与?

来自分类Dev

为什么在这里使用克隆关键字

来自分类Dev

为什么在这里使用指数枚举键?

来自分类Dev

为什么在这里使用force_encoding(“ BINARY”)?

来自分类Dev

为什么在这里必须使用括号?

来自分类Dev

Django:为什么是自我。在这里使用?

来自分类Dev

为什么在这里不能使用IF?

来自分类Dev

他们为什么在这里使用.first?

来自分类Dev

为什么在这里发生僵局

来自分类Dev

为什么在这里抛出异常?

来自分类Dev

为什么不会 for ... 在这里循环?

来自分类Dev

为什么在这里的盒子?

来自分类Dev

为什么在这里得到NullPointerException?

来自分类Dev

为什么perldoc在这里失败?

来自分类Dev

为什么在这里不确定?

来自分类Dev

为什么WlanOpenHandle()在这里失败?

来自分类Dev

为什么在这里需要静态?

来自分类Linux

为什么在这里获得SIGABRT?

来自分类Dev

为什么在这里需要分号?

来自分类Dev

为什么python在这里运行?

来自分类Dev

为什么在这里需要'break;'?