在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()'返回後會終止。 –