Подтвердить что ты не робот

Является ли поле readonly в потоке С# безопасным?

Является ли поле readonly в потоке С# безопасным?

public class Foo
{
  private readonly int _someField;

  public Foo()
  {
    _someField = 0;
  }

  public Foo(int someField)
  {
    _someField = someField;
  }

  public void SomeMethod()
  {
     doSomething(_someField);
  }
}


Прошли некоторые должности:
 - В чем преимущества маркировки поля как только для чтения на С#? - JaredPar предполагает, что только что прочитанные поля являются неизменными и, следовательно, безопасными.
 - Readonly Fields и Thread Safety, предполагает, что существует некоторый риск, если конструкторы выполняют большую работу.

Итак, если поле readonly используется как в приведенном выше коде, а конструкторы являются легкими, то это потокобезопасно? Что, если someField - это тип ref (например, массив строк)?

4b9b3361

Ответ 1

Да - ваш код не раскрывает this внутри любого конструктора, поэтому никакой другой код не может "видеть" объект до его полной сборки. Модель памяти .NET(как и для .NET 2) включает в себя барьер записи в конце каждого конструктора (для получения дополнительной информации см. Записи в блоге Joel Duffy в разделе IIRC), поэтому нет риска, что другой поток будет видеть "устаревшее" значение как я знаю.

Я бы лично обычно использовал свойство вместо этого, как способ отделить реализацию от API, но с точки зрения безопасности потоков это прекрасно.

Ответ 2

Это зависит от того, что в поле.

Чтение из поля readonly или из любого поля, которое меньше длины слова (включая все ссылочные типы), является атомной операцией.

Однако объект внутри поля readonly может быть или не быть потокобезопасным.

Ответ 3

Не смотря на ваш пример, но в целом это зависит от того, к чему обращается только для чтения, например, если словарь объявлен readonly, вы все равно можете обновлять пары значений ключа