Если вы имеете в виду «будет Check
всегда использовать самую последнюю версию поля», то да, в качестве побочного эффекта волатильности это будет иметь место - и обмен всей ссылки намного дешевле, чем постоянносинхронизация (.NET гарантирует, что у вас не будет разорванной ссылки, поэтому обмен ссылками гарантированно будет атомарным).
Примечание: в этом сценарии потокобезопасность строго в зависимости оттот факт, что хеш-набор не видоизменяется после его создания и замены ссылки, что и происходит в коде, о котором идет речь.
Вы можете получить тот же результат более удобно, однако, объявивполе как volatile
:
public class Checker
{
private volatile HashSet<int> _hs = new HashSet<int>();
public bool Check(int a) => _hs.Contains(a);
public void Update(IEnumerable<int> items) => _hs = new HashSet<int>(items);
}