Size: a a a

Kotlin Community

2020 January 10

М

Михаил in Kotlin Community
Nikita Kulikov
Здравствуйте. Не подскажете возможно ли через корутины сделать так, чтобы потребители, которые приходят с одной и той же задачей, не создавали новую задачу, а подключались к ответу старой?
Каналы можно посмотреть
источник

NK

Nikita Kulikov in Kotlin Community
Михаил
Каналы можно посмотреть
Выглядит слишком сложно, легче по старинке сделать
источник

М

Михаил in Kotlin Community
Ну если сохранять ссылку на deffered надо какой нибудь atomic reference юзать
источник

NK

Nikita Kulikov in Kotlin Community
Михаил
Ну если сохранять ссылку на deffered надо какой нибудь atomic reference юзать
Достаточно synchronize(this)
источник

М

Михаил in Kotlin Community
Михаил
недавно обсуждали вроде, но не помню к чему пришли, как правильнее сделать чтобы async не ложил джобу до вызова await?
А мне ктонибудь подскажет?) Вижу два варика, кинуть в скоуп асинк Job(), завернуть асинк в coroutineScope {} . Мб еще есть варики покрасивее?
источник

AM

Andrew Mikhaylov in Kotlin Community
Nikita Kulikov
Достаточно synchronize(this)
Это очень плохой совет при использовании корутин.
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
Достаточно synchronize(this)
синхронизироваться надо на каждое чтение, а вот атомик/волатайл можно читать откуда угодно
источник

AM

Andrew Mikhaylov in Kotlin Community
Наиболее близким аналогом для корутин будет местный мьютекс.
источник

NK

Nikita Kulikov in Kotlin Community
Andrew Mikhaylov
Это очень плохой совет при использовании корутин.
if(deffer != null) {
synchronize (this){
if(deffer != null){
deffer = get()
источник

NK

Nikita Kulikov in Kotlin Community
Что тут плохого?
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
синхронизироваться надо на каждое чтение, а вот атомик/волатайл можно читать откуда угодно
Ну и + volatile на ссылку, да, спасибо
источник

QH

Quantum Harmonizer in Kotlin Community
омагад, что я натворил
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
if(deffer != null) {
synchronize (this){
if(deffer != null){
deffer = get()
ненавижу читать такое
источник

NK

Nikita Kulikov in Kotlin Community
Nikita Kulikov
if(deffer != null) {
synchronize (this){
if(deffer != null){
deffer = get()
Хотя в таком случае volatile не нужен
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
ненавижу читать такое
А как лучше, не посоветуешь?
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
А как лучше, не посоветуешь?
мне нравится AtomicReference<Deferred>
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
мне нравится AtomicReference<Deferred>
Кажется, от блока выше всеравно никуда не деться
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
Кажется, от блока выше всеравно никуда не деться
А нельзя создать пустой Deferred, как с CF?
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
А нельзя создать пустой Deferred, как с CF?
Не понял. А что потом с ним делать
источник

QH

Quantum Harmonizer in Kotlin Community
var d: Deferred
if (ref.get().also { d = it } == null && ref.cas(null, Deferred().also { d = it }))  {
   запускаем задачу, которая присвоит внутрь d
} else {
   return d.await()
}
источник