После .NET 4.0 в .NET Framework был предоставлен безопасный тип ленивой загрузкиЛенивый Lazy может работать в многопоточной среде, что гарантированноGetValueФункция выполняется только один раз, таким образом реализуетсяРежим синглтона
Ранее мы использовали квадратичные замки суждения для реализации одиночных паттернов или статических функций инициализации классов С Lazy Type этот процесс упрощён, а производительность лучше
Когда создаётся Lazy, можно указать режим установки потока, сейчас есть два режима,Только публикация,Выговор и публикация
Режим PublicationOnly
1. Запустите функцию инициализации и введите её во внутреннийКоробкатип, решите задачу суждения по нулевой ценности, если дело создано, оно вернёт null,Этот процесс незащищён по потокам
2. Определить, пуст ли m_boxed, m_boxed — поле, сохранённое значением, если оно равно пустому, оно устанавливается в коробке, этот метод может обеспечить атомарность,Процесс безопасен по потоку
3. Если CreateValue возвращает пустые экземпляры, это означает, что другие потоки уже создали экземпляры, а затем установите их на уже созданные экземпляры
4. Отметьте метод инициализации как инициализованный, что обычно происходит при параллельном запуске, и выполните CreateValue несколько раз
Только публикациярежим используется на основеInterlocked.CompareExchange, этот класс содержит методы атомарностиCAS (Сравнение и обмен)
CAS реализуется с помощью атомарных инструкций, предоставляемых процессором, и разные версии выполнения могут иметь разные реализации Взаимозаблокированная специфическая реализация В нативном методе заинтересованные коллеги могут проверить конкретную реализацию через код coreclr/jvm
В этом режиме,Функция синглтона может выполняться несколько раз, но в конечном итоге гарантировано будет получен только один экземпляр
Режим ExcutionAndPublication
Выговор и публикациярежим, используемый в режимеVolatile+Monitor,МониторТак и естьзамокРеализация этого оператора, реализация Monitor в родном коде, является серьёзной блокировкой
МониторПоддерживаются режим сна очереди и потоков, что позволяет обеспечить выполнение всего блока метода в однопоточном состоянии
Оригинальная ссылка:Вход по гиперссылке виден. |