Middle
O fluxo lazy é uma construção segura para threads?
sobes.tech IA
Resposta da IA
lazy em Kotlin por padrão não é seguro para threads. A segurança de threads é alcançada especificando um modo de inicialização especial.
Modos disponíveis (enumeração LazyThreadSafetyMode):
SYNCHRONIZED: Padrão. Um bloqueio é usado para garantir que apenas uma thread inicialize o valor em um momento. Todas as threads veem o mesmo valor inicializado.PUBLICATION: Vários threads podem executar simultaneamente a lambda de inicialização. A primeira thread que inicializar com sucesso ganha. Os resultados dos demais são ignorados. Threads aguardando a inicialização receberão ou um valor já inicializado ou um valor inicializado por outra thread.NONE: Sem garantias de segurança de threads. Modo mais rápido. Não use este modo se houver possibilidade de acesso à propriedade preguiçosa de múltiplas threads ao mesmo tempo.
Exemplo de uso com especificação explícita do modo:
// Modo seguro para threads SYNCHRONIZED (padrão)
val safeLazyValue: String by lazy {
// Código de inicialização
"String segura para threads (SYNCHRONIZED)"
}
// Modo PUBLICATION - pode ser inicializado por múltiplas threads, mas o resultado será único.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
// Código de inicialização
"String segura para threads (PUBLICATION)"
}
// Modo não seguro para threads. Rápido, mas perigoso em multithreading.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
// Código de inicialização
"String não segura para threads (NONE)"
}