Aft*_*ess 5 c# concurrency volatile
在Java中,如果只在加入突变它的线程后才访问它,则字段不需要是volatile; 联接在关系之前强制执行.
在c#怎么样?使用下面的代码,我保证在调用Join()之后会看到_value的更新值,或者我是否需要使_value变为volatile?
private String _value = "FOO"
public void Foo()
{
Thread myThread = new Thread(Bar);
myThread.Start();
myThread.Join();
Console.WriteLine("[Main Thread] _val = "+ _value);
}
public void Bar()
{
for(int i=0; i<1000; i++)
{
Console.WriteLine("Looping");
if(i==75)
{
_value="BAR";
}
}
Console.WriteLine("DONE Looping");
}
Run Code Online (Sandbox Code Playgroud)
在我的代码片段中,是否会打印"BAR"?
常见的线程同步操作执行完整的内存屏障。开始、加入和结束线程肯定是其中之一。没有它,各种程序都会出现故障。
这些保证通常没有记录在案,但实际上是显而易见的。唉,我无法提供确凿的证据,只能说其他任何事情都是疯狂的。
请将此列表视为证据,表明这没有得到很好的记录,并且您正在寻找的财产很可能持有。
在我的代码片段中,“BAR”总是会被打印吗?
是的。我相信所有专家都会同意这一点。这是一个更简单的代码示例,它表达了同样的观点:
int x = 0;
Thread myThread = new Thread(() => x = 1);
myThread.Start();
myThread.Join();
x = 2;
Console.WriteLine(x); //Prints 2 because of memory barriers on exit and on Join.
Run Code Online (Sandbox Code Playgroud)