Ответ
DoubleCheck проверка — это паттерн в многопоточной среде, который минимизирует накладные расходы синхронизации при ленивой инициализации объекта. Сначала проверяется условие без блокировки, затем, если условие выполняется, заходит в синхронизированный блок и проверяет условие еще раз.
Пример на Kotlin:
val lazyValue: LazyType by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
// инициализация
}
Или ручная реализация:
@Volatile private var instance: MyClass? = null
fun getInstance(): MyClass {
if (instance == null) {
synchronized(this) {
if (instance == null) {
instance = MyClass()
}
}
}
return instance!!
}
Ключевые моменты:
@Volatileгарантирует видимость изменений между потоками- Вторая проверка внутри synchronized блока критически важна
- В Kotlin лучше использовать
by lazyс SYNCHRONIZED режимом