Size: a a a

Kotlin Community

2020 January 10

QH

Quantum Harmonizer in Kotlin Community
Ruslan Molchanov
Каким образом, если переменная может быть закеширована в кеше процессора? Synchronized обеспечит индивидуальный доступ, но не гарантию того, что переменная не будет кеширована
потому что JMM гарантирует чистые чтения на monitorenter и коммит в память на monitorexit
источник

QH

Quantum Harmonizer in Kotlin Community
private val ref = AtomicReference<Deferred<Unit>>(null)
fun CoroutineScope.get(): Deferred<Unit> = ref.get() ?: run {
   var d: CompletableDeferred<Unit>
   if (ref.compareAndSet(null, CompletableDeferred<Unit>().also { d = it }))  {
       launch {
           TODO()
           d.complete(Unit)
       }
       d
   } else { // race
       ref.get()!!
   }
}
источник

QH

Quantum Harmonizer in Kotlin Community
в принципе, получилось почти так же ужасно, как и double-checked locking
источник

AM

Andrew Mikhaylov in Kotlin Community
Собсна да, по мне AtomicReference -- вполне себе выход, и Миша даже нашёл уже CompletableDeferred, для того, чтобы пример завершить.
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
private val ref = AtomicReference<Deferred<Unit>>(null)
fun CoroutineScope.get(): Deferred<Unit> = ref.get() ?: run {
   var d: CompletableDeferred<Unit>
   if (ref.compareAndSet(null, CompletableDeferred<Unit>().also { d = it }))  {
       launch {
           TODO()
           d.complete(Unit)
       }
       d
   } else { // race
       ref.get()!!
   }
}
В промежутке между ref.get() и d = it может выполнится код
источник

NK

Nikita Kulikov in Kotlin Community
А, вижу compareAndSet
источник

AN

Alexander Nozik in Kotlin Community
Как минимум не надо делать поточную синхронизацию. Делайте мутекс, если очень хочется.
источник

AM

Andrew Mikhaylov in Kotlin Community
Но лично я бы таки попробовал сплясать вокруг каналов.
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
private val ref = AtomicReference<Deferred<Unit>>(null)
fun CoroutineScope.get(): Deferred<Unit> = ref.get() ?: run {
   var d: CompletableDeferred<Unit>
   if (ref.compareAndSet(null, CompletableDeferred<Unit>().also { d = it }))  {
       launch {
           TODO()
           d.complete(Unit)
       }
       d
   } else { // race
       ref.get()!!
   }
}
Да, очень клевое решение! Но разбираться в этом конечно трешак. Намного легче synchronized, хоть и если вдруг попадём в suspend, ничего хорошего не будет
источник

NK

Nikita Kulikov in Kotlin Community
Andrew Mikhaylov
Но лично я бы таки попробовал сплясать вокруг каналов.
Очень большой оверинжениринг
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
Да, очень клевое решение! Но разбираться в этом конечно трешак. Намного легче synchronized, хоть и если вдруг попадём в suspend, ничего хорошего не будет
ничего страшного не будет, внутри нашего метода стек выполнения поменяться не может
источник

QH

Quantum Harmonizer in Kotlin Community
да и если б поменялся, вроде не страшно, тут же мы не полагаемся на порядок
источник

RM

Ruslan Molchanov in Kotlin Community
Quantum Harmonizer
потому что JMM гарантирует чистые чтения на monitorenter и коммит в память на monitorexit
Да, точно. Synchronized дает прямой доступ. 👍 Запамятовал.
источник

AM

Andrew Mikhaylov in Kotlin Community
Quantum Harmonizer
ничего страшного не будет, внутри нашего метода стек выполнения поменяться не может
Вашего выше -- нет. Если бы это делалось в саспенд-функции с, собственно, саспендом под синхронайзд, корутина могла бы уплыть на другой поток, и с блокировками потока своими сам знаешь, что сделать можно.
источник

NK

Nikita Kulikov in Kotlin Community
Quantum Harmonizer
да и если б поменялся, вроде не страшно, тут же мы не полагаемся на порядок
Угу, synchronize спрятан под готовыми методами. Спасибо, воспользуюсь твоим решением
источник

AN

Alexander Nozik in Kotlin Community
Nikita Kulikov
Да, очень клевое решение! Но разбираться в этом конечно трешак. Намного легче synchronized, хоть и если вдруг попадём в suspend, ничего хорошего не будет
Намного проще вообще на java писать, или лучше на С. Вообще ни с чем разбираться не надо
источник

AM

Andrew Mikhaylov in Kotlin Community
Nikita Kulikov
Очень большой оверинжениринг
Дело ваше, вы спросили, как бы я делал -- я ответил.
источник

NK

Nikita Kulikov in Kotlin Community
Alexander Nozik
Намного проще вообще на java писать, или лучше на С. Вообще ни с чем разбираться не надо
Коллега, кажется, ваши ответы неинформативны и токсичны.
источник

NK

Nikita Kulikov in Kotlin Community
Andrew Mikhaylov
Дело ваше, вы спросили, как бы я делал -- я ответил.
Спасибо ещё раз
источник

QH

Quantum Harmonizer in Kotlin Community
Nikita Kulikov
Угу, synchronize спрятан под готовыми методами. Спасибо, воспользуюсь твоим решением
ээ, какими готовыми методами?
источник