
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)

Руслан
29.09.2017
12:52:11

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

Anton
29.09.2017
13:10:00

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

Igor
29.09.2017
17:14:37
А вот с 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”

Igor
29.09.2017
17:23:40
В моем кейсе я реально юзаю, только не Observable, а Flowable, и это реально нужно

Quantum Harmonizer
29.09.2017
17:39:37

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

Quantum Harmonizer
29.09.2017
17:41:03

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
Ну естественно, потому что после того как ты проверил на нул, в другом потоке мог быть как раз создан экземпляр

Quantum Harmonizer
29.09.2017
18:26:26

Peter
29.09.2017
18:26:37
Ой да
Ну и то, что объект может быть не полностью инициализированным - тоже опустим

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

Quantum Harmonizer
29.09.2017
18:28:59

Badya
29.09.2017
18:29:52

Quantum Harmonizer
29.09.2017
18:31:03

Badya
29.09.2017
18:31:17

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

Peter
29.09.2017
18:38:30

Quantum Harmonizer
29.09.2017
18:40:01

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'ом?".
Извините за дурацкий вопрос

Руслан
29.09.2017
18:55:05
У интерпретатора тоже могут быть оптимизации, не только jit их делает

Peter
29.09.2017
18:59:13
Тогда идём дальше. Переставляет, ок.
Но получается в случае многопоточного кода у перестановок меньше ограничений.
И что, на рантайме пометки "этот байткод можешь исполнять только ты один, а этот - не только, его можно оптимизировать пожёстче"?
Как-то не верится в такое разделение.

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