В Java поле не обязательно должно быть изменчивым, если вы обращаетесь к нему только после присоединения к потоку, который его мутировал; соединение принудительно выполняет действие до отношения.Нужен ли мне volatile, если я вызываю Thread.Join()?
Как насчет в C#? С приведенным ниже кодом я уверен, что увижу обновленное значение _value после вызова Join() или мне нужно сделать _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");
}
В моем фрагменте кода всегда печатается «BAR»?
Вам не нужна синхронизация для этого кода (кроме '.Join()'). Даже без этого вам не нужно будет использовать 'volatile', так как изменение строковой ссылки является атомной операцией, поэтому нет возможности наблюдать за разрытым значением. –
@MatthewWatson, вы имеете в виду, что из-за Join() основной поток гарантированно будет загружать новое значение _value, заданное другим потоком? – AfterWorkGuinness
Да, другой поток завершится после возвращения '.Join()'. –