lazy: -
- Представляет значение с отложенной инициализацией.
- Получает отложенное инициализированное значение текущего экземпляра Lazy. Как только значение было инициализировано, оно не должно изменяться в течение оставшейся части времени жизни этого экземпляра Lazy.
- Создает новый экземпляр Lazy, который использует указанную функцию инициализации, и режим безопасности потока по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.
- Если при инициализации значения возникает исключение, он попытается повторно инициализировать значение при следующем доступе.
lazy возвращает объект Lazy, который обрабатывает лямбда-функцию (инициализатор), выполняющую инициализацию, немного по-другому в соответствии с режимом выполнения потока (LazyThreadSafetyMode).
public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: ()
-> T): Lazy<T> =
when (mode) {
LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)
LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)
}
lazyFast: -
- Реализация ленивых, не поточнобезопасных. Полезно, когда вы знаете, в каком потоке вы будете выполняться, и не беспокоитесь о синхронизации.
lazyFast также возвращает объект Lazy с режимом LazyThreadSafetyMode.NONE
fun <T> lazyFast(operation: () -> T): Lazy<T> = lazy(LazyThreadSafetyMode.NONE) {
operation()
}
LazyThreadSafetyMode.SYNCHRONIZED: -
- Блокировки используются, чтобы гарантировать, что только один поток может инициализировать экземпляр Lazy.
LazyThreadSafetyMode.PUBLICATION: -
- Функция инициализатора может вызываться несколько раз при одновременном доступе к неинициализированному значению экземпляра Lazy, но в качестве значения экземпляра Lazy будет использоваться только первое возвращенное значение.
LazyThreadSafetyMode.NONE: -
- Никакие блокировки не используются для синхронизации доступа к значению экземпляра Lazy; если к экземпляру обращаются из нескольких потоков, его поведение не определено. Этот режим не следует использовать, если не гарантируется, что экземпляр Lazy никогда не будет инициализирован из более чем одного потока.