Size: a a a

Kotlin Community

2020 June 07

BP

Bogdan Panchenko in Kotlin Community
X
В конкретно этой ситуации нет concurrency.
И я не прошу лекцию, я прошу пример, когда в мапе может появится список с одинаковыми элементами из за работы из множества потоков. Причём надо учитывать, что это не ArrayList, а лист
я вам говорю не про дубли, а то что вы можете получить старое состояние, из-за саспенда
источник

X

X in Kotlin Community
Bogdan Panchenko
я вам говорю не про дубли, а то что вы можете получить старое состояние, из-за саспенда
Старое состояние чего? В коде указано, что это уже отдельная ссылка на лист. Он не изменяется, а создаётся новый после удаления элемента или его добавления. То есть неважно, что там в мапе после того, как оттуда считано значение. Больше оттуда не читается, а только пишется. То, что под капотом котлиновского листа мутабельный явовский лист значения не имеет, потому что в него ничего не пишется, а создаётся новый лист
источник

BP

Bogdan Panchenko in Kotlin Community
X
Всем привет. Столкнулся с оооочень странной ситуацией и пока не могу понять, почему так произошло. Ситуация из разряда "такого никогда не могло произойти". Надежда на то, что кто-то может быть подскажет, где я ошибся и чего не понял.
В общем, есть код, в котором я получаю новую заявку от биржи. Если эта заявка уже есть в локальном кэше (нахожу по двум идентификаторам: id и clientId), я ее из кеша удаляю (старую версию этой заявки) и снова добавляю ее обновленную версию. И веду логи. Все прекрасно работало без изменений несколько дней. Потом я обнаружил, что это не сработало и ордер не удалился из кэша и добавился повторно. Этого в принципе никогда не должно было случиться. И это можно отследить по логам, которые я привожу. Может, у кого-то глаз наметан и вы поймете, где косяк. Привожу код и логи в сокращенном виде (потому как там еще очень много дополнительных параметров, но суть я не удалял точно). Функция isSame() в первоначальном виде, не изменена. Именно она определяет нужный ордер из кэша.  Есть идеи, как могло так получиться, что ордер прошел строку с удалением и не удалился? Если это важно, client.receiveData() и client.findOrderByOrderId() suspend методы тоже. Выкладываю скрин, чтобы синтаксис был подсвечен. Могу выложить код, если так будет удобнее
> Если это важно, client.receiveData() и client.findOrderByOrderId() suspend методы тоже.

в этих местах может произойти засыпание, и код выполнится гораздо позже, это и есть конкаренси
источник

BP

Bogdan Panchenko in Kotlin Community
X
Старое состояние чего? В коде указано, что это уже отдельная ссылка на лист. Он не изменяется, а создаётся новый после удаления элемента или его добавления. То есть неважно, что там в мапе после того, как оттуда считано значение. Больше оттуда не читается, а только пишется. То, что под капотом котлиновского листа мутабельный явовский лист значения не имеет, потому что в него ничего не пишется, а создаётся новый лист
да какой лист, забуть, у тебя мапа глобальная, ты извелк лист, заснул, кто-то положил новый лист, ты проснудлся и положил старый лист
источник

X

X in Kotlin Community
Bogdan Panchenko
да какой лист, забуть, у тебя мапа глобальная, ты извелк лист, заснул, кто-то положил новый лист, ты проснудлся и положил старый лист
И откуда тут появится два одинаковых объекта в листе, который я положу в мапу?
источник

X

X in Kotlin Community
И это если забыть о том, что тут как бы все без параллельных вызовов сделано, как я уже сказал
источник

BP

Bogdan Panchenko in Kotlin Community
X
И откуда тут появится два одинаковых объекта в листе, который я положу в мапу?
так ты видешь дубликаты в листе или нет ?
источник

X

X in Kotlin Community
Bogdan Panchenko
так ты видешь дубликаты в листе или нет ?
Я вижу, что объект должен был удалиться по причине одинаковых id и clientId, но по крайней мере один такой объект пережил удаление. Вот что я вижу
источник

BP

Bogdan Panchenko in Kotlin Community
X
Я вижу, что объект должен был удалиться по причине одинаковых id и clientId, но по крайней мере один такой объект пережил удаление. Вот что я вижу
а кроме этого объекта лист изменился ?
источник

X

X in Kotlin Community
Bogdan Panchenko
а кроме этого объекта лист изменился ?
Проблема в том, что я не ставил логи на входе в функцию и не выводил исходный лист в эти самые логи. И я не могу сказать, изменился ли он или нет. Так бы сразу было понятно, были там изначально дубли или нет
источник

BP

Bogdan Panchenko in Kotlin Community
X
Проблема в том, что я не ставил логи на входе в функцию и не выводил исходный лист в эти самые логи. И я не могу сказать, изменился ли он или нет. Так бы сразу было понятно, были там изначально дубли или нет
источник

BP

Bogdan Panchenko in Kotlin Community
тоже нет многопоточки
источник

X

X in Kotlin Community
Bogdan Panchenko
тоже нет многопоточки
Формально - нет. Но мы то понимаем, что тут происходит. В моём случае все линейно, нет перескакиваний
источник

BP

Bogdan Panchenko in Kotlin Community
X
Формально - нет. Но мы то понимаем, что тут происходит. В моём случае все линейно, нет перескакиваний
я кода кроме саспенд функции не видел, где запускается ваша функция на каком диспатчере
источник

BP

Bogdan Panchenko in Kotlin Community
X
Формально - нет. Но мы то понимаем, что тут происходит. В моём случае все линейно, нет перескакиваний
тут по факту просто создается илюзия ожидания. Вы бы уже это проверили на своем коде, а не говорили "тут проблема нет, правда в другом месте ее тоже быть не должно"
источник

X

X in Kotlin Community
Bogdan Panchenko
я кода кроме саспенд функции не видел, где запускается ваша функция на каком диспатчере
Ну suspend как бы указывает на то, что она запускается линейно. Это не означает, что в suspend функции нельзя сделать launch, просто в моём случае все линейно. И по ссылке в примере значения меняются, но не дублируются
источник

BP

Bogdan Panchenko in Kotlin Community
X
Ну suspend как бы указывает на то, что она запускается линейно. Это не означает, что в suspend функции нельзя сделать launch, просто в моём случае все линейно. И по ссылке в примере значения меняются, но не дублируются
чиво б*ять
источник

BP

Bogdan Panchenko in Kotlin Community
X
Ну suspend как бы указывает на то, что она запускается линейно. Это не означает, что в suspend функции нельзя сделать launch, просто в моём случае все линейно. И по ссылке в примере значения меняются, но не дублируются
аспенд это функция с возможностью приостановки, какая линейность
источник

BP

Bogdan Panchenko in Kotlin Community
Захар это ты ?
источник

X

X in Kotlin Community
Bogdan Panchenko
тут по факту просто создается илюзия ожидания. Вы бы уже это проверили на своем коде, а не говорили "тут проблема нет, правда в другом месте ее тоже быть не должно"
Код придельно прост, там не было никаких launch, проверять нечего - я его сам недавно писал
источник