【发布时间】:2012-05-29 09:22:03
【问题描述】:
在下面的代码中read1 总是等于read2,前提是属性Flag 可以从其他线程更改?这里担心的是Flag 可能会被内联。
private bool Flag {get; set;}
public void MultithreadedMethod()
{
var read1 = Flag;
/* some more code */
var read2 = Flag;
}
UPD:在/* some more code */ 执行期间,其他一些线程可能会更改Flag 的值。在这种情况下,read1 应该不同于 read2。 总是会这样吗?尽管Flag 在读取之间发生了更改,但内联不会将属性转换为非易失性字段,这将导致read1 等于read2?
【问题讨论】:
-
我认为没有理由保证。当然,
volatile通常也没有人们想象的那么大的意义。如果重要的话,我个人会看lock或Interlocked。
标签: c# multithreading concurrency