Я не знаю, как это взаимодействует с сопрограммами.Но в обычном кодировании:
Это всегда проблема с отложенной выборкой.Мне известны два основных подхода: либо вызов использует какую-либо форму синхронизации, либо рисковать множественными выборками в качестве наказания за избежание блокировки (как в вашем примере).
Первый случай болеесложный для написания, но не всегда синхронизируемый;Вы можете проверить кэшированное значение и, если оно найдено, использовать его;иначе вы можете получить блокировку и снова проверить , извлекая значение только в том случае, если оно все еще отсутствует.Такая двойная проверка блокировки довольно сложна, но после того, как значение было выбрано, опубликовано и устаревшие значения кэша истекли, ему больше не нужно использовать блокировку.
Но вместо записи этогоСам Kotlin сделал это за вас - вы можете просто объявить свойство как делегированное ленивым , и позволить stdlib выполнить всю тяжелую работу!Он даже позволяет вам указать, какой режим безопасности потока использовать.