Після .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
Висловлення та публікаціярежим, що використовується в режиміВолатил+Монітор,МоніторТак і єзамокРеалізація цього оператора, реалізація Monitor у рідному коді, є потужним блокуванням
МоніторПідтримуються режим сну черги та потоків, що дозволяє забезпечити виконання всього блоку методу в однопоточному стані
Оригінальне посилання:Вхід за гіперпосиланням видно. |