在Java中,如果仅在加入变体的线程后才访问该字段,则该字段不必是易失性的;该联合在关系之前强制执行。如果我调用Thread.Join(),是否需要volatile?
在c#中怎么样?使用下面的代码,我保证在调用Join()之后看到_value的更新值,还是需要使_value易变?
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");
}
在我的代码片段中,会不会打印“BAR”?
您不需要为该代码进行任何同步(除'.Join()')之外。即使没有它,你也不需要使用'volatile',因为改变一个字符串引用是一个原子操作,所以没有机会观察到一个残缺的值。 –
@MatthewWatson,你的意思是说,因为Join(),主线程保证会获取由其他线程设置的_value的新值? – AfterWorkGuinness
是的,另一个线程在'.Join()'返回后会终止。 –