Spec-Zone.ru › Kotlin 2

lazy

kotlin-stdlib/kotlin/lazy

Требования к платформе и версии: Common (1.0)

expect fun <T> lazy(initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков по умолчанию LazyThreadSafetyMode.SYNCHRONIZED. Используемая блокировка зависит от платформы и реализации.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

println("What is the answer?")
// Will print 'Computing...' and then 42
println(answer) // 42
println("Come again?")
// Will just print 42
println(answer) // 42 
   //sampleEnd
}

expect fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков mode.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Для режима LazyThreadSafetyMode.SYNCHRONIZED используемая блокировка зависит от платформы и реализации.

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

val t1 = thread {
    println("Thread 1: $answer")
}

val t2 = thread {
    println("Thread 2: $answer")
}

// It is guaranteed that 'Computing' message will be printed once, and both threads will see 42 as an answer
t1.join()
t2.join() 
   //sampleEnd
}
import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   class Answer(val value: Int, val computedBy: Thread = Thread.currentThread()) {
    override fun toString() = "Answer: $value, computed by: $computedBy"
}

val answer: Answer by lazy(LazyThreadSafetyMode.PUBLICATION) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    Answer(42)
}

val t1 = thread(name = "#1") {
    println("Thread 1: $answer")
}

val t2 = thread(name = "#2") {
    println("Thread 2: $answer")
}

// It is **not** guaranteed that 'Computing' message will be printed once,
// but guaranteed that both threads will see 42 computed by *the same* thread as an answer
t1.join()
t2.join() 
   //sampleEnd
}

expect fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T>

Устарело

Предупреждение с версии 1.9

Ошибка с версии 2.1

Синхронизация по объекту Any? поддерживается только в Kotlin/JVM.

Заменить на

lazy(initializer)

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer.

Параметр lock игнорируется.

Требования к платформе и версии: JS (1.1), Wasm-JS (1.8), Wasm-WASI (1.8)

actual fun <T> lazy(initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer.


actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer.

Параметр mode игнорируется.


actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T>

Устарело

Предупреждение с версии 1.9

Ошибка с версии 2.1

Синхронизация по объекту Any? не поддерживается.

Заменить на

lazy(initializer)

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer.

Параметр lock игнорируется.

Требования к платформе и версии: JVM (1.0)

actual fun <T> lazy(initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

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

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

println("What is the answer?")
// Will print 'Computing...' and then 42
println(answer) // 42
println("Come again?")
// Will just print 42
println(answer) // 42 
   //sampleEnd
}

actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков mode.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Если указан режим LazyThreadSafetyMode.SYNCHRONIZED, возвращённый экземпляр использует сам себя для синхронизации. Не выполняйте синхронизацию по возвращённому экземпляру из внешнего кода, так как это может привести к случайной взаимной блокировке. Это поведение может измениться в будущем.

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

val t1 = thread {
    println("Thread 1: $answer")
}

val t2 = thread {
    println("Thread 2: $answer")
}

// It is guaranteed that 'Computing' message will be printed once, and both threads will see 42 as an answer
t1.join()
t2.join() 
   //sampleEnd
}
import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   class Answer(val value: Int, val computedBy: Thread = Thread.currentThread()) {
    override fun toString() = "Answer: $value, computed by: $computedBy"
}

val answer: Answer by lazy(LazyThreadSafetyMode.PUBLICATION) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    Answer(42)
}

val t1 = thread(name = "#1") {
    println("Thread 1: $answer")
}

val t2 = thread(name = "#2") {
    println("Thread 2: $answer")
}

// It is **not** guaranteed that 'Computing' message will be printed once,
// but guaranteed that both threads will see 42 computed by *the same* thread as an answer
t1.join()
t2.join() 
   //sampleEnd
}

actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Возвращённый экземпляр использует для синхронизации указанный объект lock. Если объект lock не указан, экземпляр использует сам себя для синхронизации. В этом случае не выполняйте синхронизацию по возвращённому экземпляру из внешнего кода, так как это может привести к случайной взаимной блокировке. Это поведение может измениться в будущем.

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val lock = Any()
val answer: Int by lazy(lock) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

// Lock is acquired first, so thread cannot compute the answer
val thread: Thread
synchronized(lock) {
    thread = thread(name = "#1") {
        println("Thread is asking for an answer")
        println("$answer")
    }
    println("Let's hold the thread #1 for a while with a lock")
    Thread.sleep(100) // Let it wait
}
// Lock is unlocked, the thread will print an answer
thread.join() 
   //sampleEnd
}

Требования к платформе и версии: Native (1.3)

actual fun <T> lazy(initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

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

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

println("What is the answer?")
// Will print 'Computing...' and then 42
println(answer) // 42
println("Come again?")
// Will just print 42
println(answer) // 42 
   //sampleEnd
}

actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков mode.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Примеры

import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   val answer: Int by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    42
}

val t1 = thread {
    println("Thread 1: $answer")
}

val t2 = thread {
    println("Thread 2: $answer")
}

// It is guaranteed that 'Computing' message will be printed once, and both threads will see 42 as an answer
t1.join()
t2.join() 
   //sampleEnd
}
import kotlin.concurrent.thread

fun main() { 
   //sampleStart 
   class Answer(val value: Int, val computedBy: Thread = Thread.currentThread()) {
    override fun toString() = "Answer: $value, computed by: $computedBy"
}

val answer: Answer by lazy(LazyThreadSafetyMode.PUBLICATION) {
    println("Computing the answer to the Ultimate Question of Life, the Universe, and Everything")
    Answer(42)
}

val t1 = thread(name = "#1") {
    println("Thread 1: $answer")
}

val t2 = thread(name = "#2") {
    println("Thread 2: $answer")
}

// It is **not** guaranteed that 'Computing' message will be printed once,
// but guaranteed that both threads will see 42 computed by *the same* thread as an answer
t1.join()
t2.join() 
   //sampleEnd
}

actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T>

Устарело

Ошибка с версии 1.9

Скрыто с версии 2.1

Синхронизация по объекту Any? не поддерживается.

Заменить на

lazy(initializer)

Создаёт новый экземпляр Lazy, использующий указанную функцию инициализации initializer и режим безопасности потоков по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.

Если при инициализации значения возникает исключение, при следующем обращении будет предпринята попытка повторно инициализировать значение.

Возвращённый экземпляр использует для синхронизации указанный объект lock.

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/lazy.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API