Как запустить ленивый init на рабочем потоке - PullRequest
0 голосов
/ 10 марта 2019

У меня есть поле val mThing, которое я начинаю с by lazyThing().Теперь я ожидаю, что вызов lazyThing() займет некоторое время, поэтому я хотел бы начать инициализацию в рабочем потоке.Очевидно, что это нормально, если какой-то другой поток приходит и нуждается в mThing и ждет его, но я бы хотел как можно скорее начать инициализацию в рабочем потоке.Как выглядит этот способ в Котлине?

Или, если шаблон лучше, чем ленивая инициализация, я открыт для предложений.

1 Ответ

1 голос
/ 10 марта 2019

Вы можете указать режим синхронизации в функции lazy: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-lazy-thread-safety-mode/index.html

Самый простой способ - дать JVM инициализацию при загрузке класса. Таким образом, вы можете объявить класс или объект, который имеет поле с результатами вычислений. Далее JVM выполнит необходимые блокировки:

object ComputeValueOnClassLoad {
  val value = lazyThing()
}

Первый рабочий поток будет использовать класс, он будет инициализировать загрузку класса и, таким образом, вычислять значение. Другие темы будут ждать этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...