猿问

易失性与互锁与锁定

易失性与互锁与锁定

假设一个类有一个public int counter由多个线程访问的字段。这,这个int只会增加或减少。

要增加这个字段,应该使用哪种方法,以及为什么?

  • lock(this.locker) this.counter++;,

  • Interlocked.Increment(ref this.counter);,

  • 更改

    counter

    public volatile.

现在我发现volatile,我一直在移走许多lock声明和使用Interlocked..但有理由不这么做吗?


POPMUISE
浏览 314回答 3
3回答

冉冉说

正如在评论中提到的,这些天我很乐意使用Interlocked就a类案件而言单变量在那里显然好的。当事情变得更复杂的时候,我仍然会回到锁定.。使用volatile当您需要增加时,不会有帮助-因为读和写是分开的指令。另一个线程可以在读完之后,在写回之前更改值。就我个人而言,我几乎总是把锁起来-用这样的方式更容易得到正确的结果显然比波动或联锁更正确。就我而言,无锁多线程是真正的线程专家,而我不是其中之一。如果JoeDuffy和他的团队构建了一个很好的库,它可以并行化一些东西,而不像我构建的那样多锁,这太棒了,我会在心跳中使用它-但是当我自己做线程时,我尽量保持简单。

湖上湖

"volatile“不取代Interlocked.Increment!它只是确保变量不是缓存的,而是直接使用的。递增变量实际上需要三个操作:朗读,阅读增量写Interlocked.Increment作为一个原子操作执行所有三个部分。
随时随地看视频慕课网APP
我要回答