169 похожих чатов

Попытаю ещё раз удачу ``` Ребята, можете подсказать? Есть задача - коллекция пользоватлей/ если

пользователь в работе, то флаг == true
в многопотоке нужно брать только пользователей с block == false, и менять ему тут же на true, чтобы другой поток его не украл.

Подскажите, пожалуйста. как можно подойти к такой задаче?

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

9 ответов

18 просмотров

withLock?

class A(val block: AtomicBoolean) listOf(A(AtomicBoolean())).firstOrNull { it.block.compareAndSet(false, true) }

Alexander-Zapevalov Автор вопроса
Ruslan Ibragimov
class A(val block: AtomicBoolean) listOf(A(AtomicB...

выглядит простым и рабочим решением. Так ли нужны тут корутины?

Alexander Zapevalov
выглядит простым и рабочим решением. Так ли нужн...

Может нужны, а может и нет. Зависит от задачи. Проблема как по флагу найти элемент в коллекции и потоко-безапасно его обновить выполнили Остается задача обновления коллекции

Ruslan Ibragimov
class A(val block: AtomicBoolean) listOf(A(AtomicB...

Тоже подумал про атомарные операции на CompareExchange сразу же

Если на Яве, я бы сделал объект с двумя полями, имя и статус, при изменении статуса синхронизировался бы целиком на объекте и менял статус. Ну а хранил бы уже как удобнее для задачи. Или по статусу или по имени.

Alexander-Zapevalov Автор вопроса
Andrey Panov
Если на Яве, я бы сделал объект с двумя полями, им...

В джаве так оно и было бы, да. Просто в Котлине есть более интересные решения. одно из которых корутины. даже не задумывался о том, разные там потоки или нет 🙂 Вроде как корутины работают в главном потоке

Alexander Zapevalov
В джаве так оно и было бы, да. Просто в Котлине е...

корутины работают в своем пуле потоков, может быть несколько, а может быть один (как например Dispatchers.Main)

Alexander Zapevalov
В джаве так оно и было бы, да. Просто в Котлине е...

Я потому и задал вопрос по корутины, что не уверен. Если все они будут в одном потоке, то вообще ничего придумывать не нужно, взял и поменял. Но я бы на это не рассчитывал и оставил как в Яве. А то поменяют поведение по умолчанию и все...

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта