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
并不能阻止它。您需要使用lock
,或者可能使用Interlocked.Increment
,以确保每个操作都是原子操作。
正如您所写的"线程1再次被调度,现在线程1将从寄存器(这是10)中获取i值并将其增加到11并将其写回i,或者它将从原始源读取并将i值读取为9并将其增加到10?"-编辑:在@Servy的帮助下:1-st线程将使用值10,因为它之前被读取以执行下一个添加操作。