@kotlin_lang

Страница 350 из 982
Gleb
29.09.2017
12:36:00
wrong

Nikita
29.09.2017
12:36:02
Не путайте асинхронность и многопоточность)

Dmitry
29.09.2017
12:36:25
Просвети

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

Google
Nikita
29.09.2017
12:40:04
Статей много на эту тему

Roman
29.09.2017
12:40:13
Инкапсулируйте ваши корутины в top-level функции и всё будет хорошо.

Igor
29.09.2017
12:42:09
И не мутируйте стейт, все же так просто

Fedor
29.09.2017
12:45:30
Когда я только начинал вот это вот все, мне старший коллега говорил: "Если не знаешь что сказать, но хочешь сойти за умного, говори что полиморфизм \ инкапсуляция рулят, а множественное наследование - днище" Ну или как-то так. Прошло 7 лет, но все на месте

Ну и нет, я без каких-то намеков, просто вспомнил, поржал :)

Sergey
29.09.2017
12:46:24
это к чему вообще?

Fedor
29.09.2017
12:46:42
Очевидно - хочу сойти за умного

Dmitry
29.09.2017
12:47:18
Вот на счет не мутировать стейт, когда экран замороченный и все компоненты друг от друга зависят, это сложновато. Попробую бекграунд таски выносить в топ левел интернал функции, но сейчас это все придется делать руками. Хотя было бы здорово как в РХ просто сказать, что вот этот сегмент выполни синхронно в бэкграунде, а остальное дальше в UI. Но сейчас надо будет на ревью смотреть, чтобы в бэкграунд лямбде изменяемые состояния не использовались.

Igor
29.09.2017
12:51:46
Многопоточно вообще переоценена, вон шустрый VSCode вообще написана на node.js с одним потоком (одного потока хватит всем (c)). Есть конкаренси, есть колбеки, IO на фоновый поток (теор. там даже не потоки, а ПРЕРЫВАНИЯ) и этого хвататет. А что бы жизнь была сахаром (без колбеков), придумали корутины (и в js и в kotlin)

Dmitry
29.09.2017
12:55:27
Скажем по другому. У меня есть куча обьектов с разными характеристиками, + профиль и при переходе на экран фильтра я должен пройтись по всем доступным обьектам и профилю, построить доступные фильтры динамически, это во время перехода на экран фильтра, который не должен лагать. И думать я хочу про эджкейсы фильтра, компоненты которого друг от друга зависят, а не о unidirectional flow.

Igor
29.09.2017
13:50:08
По крайней мере когда я писал к нему расширение, то любая синхронная операция вызвала зависание всего.

Google
Alexey
29.09.2017
15:22:51
Ребят, обновите аватарку. Эта же уже устарела.

У котлина другой логотип.

Nick Senchurin
29.09.2017
15:23:26
это легаси, с легаси надо уметь жить

не нравится - перепиши ^^

Юра
29.09.2017
15:23:51
Обновим аватарку и заживём по-новому) Это как про декоммунизацию у нас в городе.

Alexey
29.09.2017
15:24:00
Kirill
29.09.2017
15:24:13
? animufag ?
29.09.2017
15:31:01
Не путайте асинхронность и многопоточность)

Статей много на эту тему

кажется кто-то наконец может объяснить разницу

Quantum Harmonizer
29.09.2017
15:33:39
Ребят, обновите аватарку. Эта же уже устарела.
это обязательно?) Вроде же няшный чайник.

Alexey
29.09.2017
15:34:06
это обязательно?) Вроде же няшный чайник.
Не привычно в котлине видеть старую аву)

? animufag ?
29.09.2017
15:36:32
блин нет времени на срачи в чатиках, насчёт понимания терминов есть норм понимание того что такое паралелльность, многопоточность (эти двое почти синонимы), конкаренси (не обязательно многопоточный) и есть слово асинхроннсость которое что-то там про организацию датафлоу наверное, но вроде такой же баззворд как и реактивщина

Quantum Harmonizer
29.09.2017
15:36:33
Довольствуйтесь новыи лого у бота. :)

Igor
29.09.2017
17:11:48
А кто-нибудь миксовал корутины и rxKotlin?

Странный вопрос, мне просто в голову пришло подключить rx, вроде все классно, но роутинг на ktor, а там корутины...

Igor
29.09.2017
17:14:06
Странный вопрос, мне просто в голову пришло подключить rx, вроде все классно, но роутинг на ktor, а там корутины...
> в голову пришло подключить rx А есть какая-то техническая необходимость для этого?

Igor
29.09.2017
17:14:37
> в голову пришло подключить rx А есть какая-то техническая необходимость для этого?
Для rx - да, реактивная работа с данными на этом проекте очень и очень сильно облегчит жизнь.

А вот с ktor можно и слезть при необходимости.

Igor
29.09.2017
17:16:02
Ты реально юзаешь rx.Observable где больше 1 сообщения и джонишь события их них (те реал реативщена)?

Google
Kirill
29.09.2017
17:16:26
Igor
29.09.2017
17:20:01
https://github.com/Kotlin/kotlinx.coroutines/blob/master/reactive/kotlinx-coroutines-rx2/src/main/kotlin/kotlinx/coroutines/experimental/rx2/RxChannel.kt#L45 Этот метод как-бы говорит “тебе не нужные observable”

Quantum Harmonizer
29.09.2017
17:39:37
Igor
29.09.2017
17:40:19
так каналы, акторы, все дела
Не знаком я с этим всем :) Поэтому и в приоритет поставил старый-добрый rx. Интересует поэтому сочетаемость корутин с ним, а не наоборот

Quantum Harmonizer
29.09.2017
17:41:03
Не знаком я с этим всем :) Поэтому и в приоритет поставил старый-добрый rx. Интересует поэтому сочетаемость корутин с ним, а не наоборот
Они друг другу не помешают, но будет неудобно из-за того, что это разные подходы. Всё же рекомендую попробовать акторы.

Igor
29.09.2017
17:41:22
окей.

Посмотрим, подумаем.

Спасибо

Peter
29.09.2017
18:10:46
Я опоздал на обсуждение jmm( Я тут на днях читал статью Шипилёва про safe publications и встретил пример, который сломал мою голову. public class UnsafeDCLFactory { private Singleton instance; public Singleton get() { if (instance == null) { // read 1, check 1 synchronized (this) { if (instance == null) { // read 2, check 2 instance = new Singleton(); } } } return instance; // read 3 } } Он заявляет, что инструкции read вне synchronized блока jvm может переставлять как хочет, что может привести к возвращению null из метода get(). Ситуация абсолютно не укладывается в голове, но вопрос возникает предельно абстрактный, типа "Как теперь жить?". Если вдуматься, то может кто видел объяснения на пальцах "на что нельзя расчитывать в многопоточном Java коде?", желательно с пояснениями почему. Ну или объяснения когда такой реордеринг может произойти, и что ещё jvm нам готовит?

Или jmm в одно окно, java concurrency in practice в другое и читать до просветления?

Anton
29.09.2017
18:13:07
В конкаренси ин практис раьота джмм описывается

Alex
29.09.2017
18:17:57
Я опоздал на обсуждение jmm( Я тут на днях читал статью Шипилёва про safe publications и встретил пример, который сломал мою голову. public class UnsafeDCLFactory { private Singleton instance; public Singleton get() { if (instance == null) { // read 1, check 1 synchronized (this) { if (instance == null) { // read 2, check 2 instance = new Singleton(); } } } return instance; // read 3 } } Он заявляет, что инструкции read вне synchronized блока jvm может переставлять как хочет, что может привести к возвращению null из метода get(). Ситуация абсолютно не укладывается в голове, но вопрос возникает предельно абстрактный, типа "Как теперь жить?". Если вдуматься, то может кто видел объяснения на пальцах "на что нельзя расчитывать в многопоточном Java коде?", желательно с пояснениями почему. Ну или объяснения когда такой реордеринг может произойти, и что ещё jvm нам готовит?
я тут совсем новичек но это поведение описывается как hp(x,y) из https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.4.5 которое при мульти поточности мы не можем гаратнтировать. hb(x,y) в этом примере не может гарантировать hb(y,x) или я не прав?

Peter
29.09.2017
18:18:26
Ну, если там описывается jmm, то и happens-before consistency rules там есть.

Угу, вроде оно. Но, блин, побаиваюсь этих талмудов. Есть впечатление, что они слишком большие и фундаментальные.

Quantum Harmonizer
29.09.2017
18:20:07
Я опоздал на обсуждение jmm( Я тут на днях читал статью Шипилёва про safe publications и встретил пример, который сломал мою голову. public class UnsafeDCLFactory { private Singleton instance; public Singleton get() { if (instance == null) { // read 1, check 1 synchronized (this) { if (instance == null) { // read 2, check 2 instance = new Singleton(); } } } return instance; // read 3 } } Он заявляет, что инструкции read вне synchronized блока jvm может переставлять как хочет, что может привести к возвращению null из метода get(). Ситуация абсолютно не укладывается в голове, но вопрос возникает предельно абстрактный, типа "Как теперь жить?". Если вдуматься, то может кто видел объяснения на пальцах "на что нельзя расчитывать в многопоточном Java коде?", желательно с пояснениями почему. Ну или объяснения когда такой реордеринг может произойти, и что ещё jvm нам готовит?
В этом примере есть две ужасно уродливых вещи — синглтон и ленивая инициализация с двойной проверкой.

Badya
29.09.2017
18:23:52
Peter
29.09.2017
18:24:48
Да никто не спорит (хотя можно заметить о существовании синглтона на уровне языка в Котлине. Object - это ж синглтон)? Меня беспокоит изменившееся поведения метода при переезде из однопоточной среды в многопоточную. Если утрировать ```public MyClass lazyGet() { if (instance == null) instance = new MyClass; return instance; }```Вот этот код при условии, что его вызывает один поток - гарантированно возвращает не null. Много потоков - гарантия пропадает.

Google
Peter
29.09.2017
18:25:18
Я же правильно понимаю?

Badya
29.09.2017
18:25:55
Ну естественно, потому что после того как ты проверил на нул, в другом потоке мог быть как раз создан экземпляр

Peter
29.09.2017
18:26:37
Ой да

Ну естественно, потому что после того как ты проверил на нул, в другом потоке мог быть как раз создан экземпляр
И что? Присвоение ссылок в java гарантированно атомарное, поэтому может вернутся ссылка на разные объекты разным потокам. Это понятно. А вот null

Ну и то, что объект может быть не полностью инициализированным - тоже опустим

Alex
29.09.2017
18:28:58
а почему вы не вспомнили про остроумную реализацию, через enum в яве, через val в kotlin?

Badya
29.09.2017
18:29:52
И что? Присвоение ссылок в java гарантированно атомарное, поэтому может вернутся ссылка на разные объекты разным потокам. Это понятно. А вот null
Так ты создашь новый объект и положишь ссылку на него, а в другом потоке который уже его создавал ссылка останется на старый - вот тебе и 2 синглтона

Badya
29.09.2017
18:31:17
с synchronized такого не будет
Ну я про случай без синхрона

Peter
29.09.2017
18:31:27
А можно про null?

В любом случае

Igor
29.09.2017
18:32:06
Я опоздал на обсуждение jmm( Я тут на днях читал статью Шипилёва про safe publications и встретил пример, который сломал мою голову. public class UnsafeDCLFactory { private Singleton instance; public Singleton get() { if (instance == null) { // read 1, check 1 synchronized (this) { if (instance == null) { // read 2, check 2 instance = new Singleton(); } } } return instance; // read 3 } } Он заявляет, что инструкции read вне synchronized блока jvm может переставлять как хочет, что может привести к возвращению null из метода get(). Ситуация абсолютно не укладывается в голове, но вопрос возникает предельно абстрактный, типа "Как теперь жить?". Если вдуматься, то может кто видел объяснения на пальцах "на что нельзя расчитывать в многопоточном Java коде?", желательно с пояснениями почему. Ну или объяснения когда такой реордеринг может произойти, и что ещё jvm нам готовит?
На самом деле такое может быть очень и очень редко вполне на конкретных процессорных архитектурах. Как жить - надеяться на лучшее или писать код параноика

Если я правильно понял, о чем речь

Peter
29.09.2017
18:35:24
А лучше - использовать написанные параноиками либы. Просто не могу понять как один и тот же байткод (фактически), работает по-разному в зависимости от того сколько потоков его вызывает. Или это может наблюдаться только после JIT'a, а с выключенным JIT'ом не null тоже гарантирован?

Igor
29.09.2017
18:35:27
то есть happens before встретить в реальной практике мягко говоря, сложно. И это будет тотальный зашквар

Badya
29.09.2017
18:36:00
В случае с синхроном и дабл чеком: Первый чек как минимум для перфоманса - ибо брать Лок дорогая операция впринципе, а объект уже может существовать. Дальше ты делаешь синхронайзд, который гарантирует что код под ним будет в "один поток". Дальше проверяешь на нулл потому что на синхронайзде ты мог стоять на локе и ждать пока другой поток создаёт инстас - следовательно когда ты упал внутрь ты спокойно создашь новый если этого не было, или возьмёшь существующий

Google
Badya
29.09.2017
18:41:23
И именно поэтому нужно добавить перед полем instance volatile

Потому что volatile write happens before volatile read

Если мне не изменяет память

https://m.habrahabr.ru/post/129494/

Читать пункт 2.1

Именно этим же и объясняется зачем GC всегда нужен STW

Peter
29.09.2017
18:46:49
Пункт 2.1 опять говорит про частично сконструированный объект, и ни слова про пеерстановку readов(

Badya
29.09.2017
18:48:42
Тогда хочу точную цитату Шипилева для ясности

Peter
29.09.2017
18:49:39
https://shipilev.net/blog/2014/safe-public-construction/ Под первый code snippet пункт 2

Надо попытать гугл именно на тему перестановки read'ов. Боюсь очень специфичный топик, который мало кому нужен. Пока оформившийся вопрос звучит "Имеет ли право jvm переставлять инструкции байткода с выключенным jit'ом?". Извините за дурацкий вопрос

Peter
29.09.2017
18:59:13
Тогда идём дальше. Переставляет, ок. Но получается в случае многопоточного кода у перестановок меньше ограничений.

И что, на рантайме пометки "этот байткод можешь исполнять только ты один, а этот - не только, его можно оптимизировать пожёстче"? Как-то не верится в такое разделение.

Руслан
29.09.2017
19:06:36


Страница 350 из 982