Если вы используете .NET 1.1, ключевое слово volatile необходимо при двойном проверке блокировки. Зачем? Поскольку до .NET 2.0 следующий сценарий мог привести к тому, что второй поток получил доступ к непунктовому, но еще не полностью сконструированному объекту:
До .NET 2.0 this.foo может быть назначен новый экземпляр Foo, прежде чем конструктор будет запущен. В этом случае может появиться второй поток (во время вызова потока 1 к конструктору Foo) и испытать следующее:
До .NET 2.0 вы можете объявить this.foo нестабильным, чтобы обойти эту проблему. Начиная с .NET 2.0 вам больше не нужно использовать ключевое слово volatile для выполнения двойной блокировки.
В Википедии есть хорошая статья о Double Checked Locking и кратко затрагивает эту тему: http: //en.wikipedia.org/wiki/Double-checked_locking
Вместо этого перегрузите функцию.
Версия с 5 параметрами использует часть true
из if
.
Другая версия использует false
часть if
.