(这是重复:如何正确读取 Interlocked.Increment'ed int 字段?但是,在阅读了答案和评论后,我仍然不确定正确的答案。)
有些代码我不拥有,也无法更改为使用在几个不同线程中递增 int 计数器 (numberOfUpdates) 的锁。所有调用都使用:
Interlocked.Increment(ref numberOfUpdates);
我想在我的代码中阅读 numberOfUpdates 。现在,由于这是一个 int,我知道它不能撕裂。但是,确保我获得最新价值的最佳方式是什么?看来我的选择是:
int localNumberOfUpdates = Interlocked.CompareExchange(ref numberOfUpdates, 0, 0);
或者
int localNumberOfUpdates = Thread.VolatileRead(numberOfUpdates);
两者都可以工作吗(在提供最新价值的意义上,无论优化、重新排序、缓存等如何)?一个比另一个更受欢迎吗?有没有更好的第三种选择?