Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 2976|Ответ: 2

[Источник] Как Lazy в C# сохраняет безопасность ниток

[Скопировать ссылку]
Опубликовано 02.07.2023 21:41:55 | | |
После .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 в родном коде, является серьёзной блокировкой

МониторПоддерживаются режим сна очереди и потоков, что позволяет обеспечить выполнение всего блока метода в однопоточном состоянии


Оригинальная ссылка:Вход по гиперссылке виден.




Предыдущий:ASP.NET разница между ThreadStatic, CallContext и HttpContext
Следующий:SQL Server запрашивает текущее количество подключений к базе данных
 Хозяин| Опубликовано 02.07.2023 21:42:16 |
 Хозяин| Опубликовано 04.07.2023 19:19:45 |
Оптимизация производительности C#: Lazy инициализирует Lazy<T> с задержкой
https://www.itsvse.com/thread-7700-1-1.html
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com