我正在阅读关于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?
由于
答案 0 :(得分:8)
增量/减量操作不是原子操作,因此您描述的竞争条件完全可能。使用volatile
并不能阻止它。您需要使用lock
或Interlocked.Increment
,以确保操作都是原子操作。
答案 1 :(得分:0)
当您写道“线程1再次被调度时,现在线程1将采用i值格式寄存器(为10)并将其递增为11并将其写回i或将其从原始源读取并读取i值为9并将其增加到10?“ - 编辑:在@Servy的帮助下:第一个线程将使用值10,因为之前已读取它以执行下一个添加操作。