Как узнать, не был ли передан параметр при создании объекта?

Если вы используете .NET 1.1, ключевое слово volatile необходимо при двойном проверке блокировки. Зачем? Поскольку до .NET 2.0 следующий сценарий мог привести к тому, что второй поток получил доступ к непунктовому, но еще не полностью сконструированному объекту:

  1. В Thread 1 спрашивается, равна ли переменная. //if(this.foo == null)
  2. Тема 1 определяет, что переменная имеет значение null, поэтому вводит блокировку. //lock(this.bar)
  3. Тема 1 запрашивает AGAIN, если переменная имеет значение null. //if(this.foo == null)
  4. Thread 1 все еще определяет, что переменная имеет значение null, поэтому вызывает конструктор и присваивает значение переменной. //this.foo = new Foo ();

До .NET 2.0 this.foo может быть назначен новый экземпляр Foo, прежде чем конструктор будет запущен. В этом случае может появиться второй поток (во время вызова потока 1 к конструктору Foo) и испытать следующее:

  1. В Thread 2 спрашивается, равна ли переменная null. //if(this.foo == null)
  2. В Thread 2 определяется, что переменная не равна null, поэтому пытается ее использовать. //this.foo.MakeFoo()

До .NET 2.0 вы можете объявить this.foo нестабильным, чтобы обойти эту проблему. Начиная с .NET 2.0 вам больше не нужно использовать ключевое слово volatile для выполнения двойной блокировки.

В Википедии есть хорошая статья о Double Checked Locking и кратко затрагивает эту тему: http: //en.wikipedia.org/wiki/Double-checked_locking

4
задан Jarod42 19 March 2019 в 16:21
поделиться

1 ответ

Вместо этого перегрузите функцию.

Версия с 5 параметрами использует часть true из if.

Другая версия использует false часть if.

0
ответ дан Bathsheba 19 March 2019 в 16:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: