volatile关键字的使用

本文关键字:关键字 volatile | 更新日期: 2023-09-27 17:50:58

我正在阅读volatile关键字,想知道下面的场景如何运行。

Class SomeClass
 {
  volatile int i = 10;
 }

两个线程正在尝试修改变量i。

Thread 1 does i = i + 1;
Thread 2 does i = i - 1;

操作顺序如下:

线程1读取变量i到CPU寄存器。此时发生线程切换。线程2读取变量i并将其减1,因此现在i的值为9;线程1再次被调度,现在线程1将从寄存器中获取i值(这是10)并将其增加到11并将其写回i,或者它将从原始源读取并将i值读取为9并将其增加到10?

谢谢

volatile关键字的使用

递增/递减操作不是原子性的,因此您所描述的竞争条件是完全可能的。使用volatile并不能阻止它。您需要使用lock,或者可能使用Interlocked.Increment,以确保每个操作都是原子操作。

正如您所写的"线程1再次被调度,现在线程1将从寄存器(这是10)中获取i值并将其增加到11并将其写回i,或者它将从原始源读取并将i值读取为9并将其增加到10?"-编辑:在@Servy的帮助下:1-st线程将使用值10,因为它之前被读取以执行下一个添加操作。