пользователь в работе, то флаг == true
в многопотоке нужно брать только пользователей с block == false, и менять ему тут же на true, чтобы другой поток его не украл.
Подскажите, пожалуйста. как можно подойти к такой задаче?
мне понятно, что коллекция должна быть мутабельная и волатильная, чтобы все потоки видели изменения данной коллекции, но вот как это красиво сделать на Котлине, пока не до конца понимаю.
```
withLock?
class A(val block: AtomicBoolean) listOf(A(AtomicBoolean())).firstOrNull { it.block.compareAndSet(false, true) }
выглядит простым и рабочим решением. Так ли нужны тут корутины?
Может нужны, а может и нет. Зависит от задачи. Проблема как по флагу найти элемент в коллекции и потоко-безапасно его обновить выполнили Остается задача обновления коллекции
Тоже подумал про атомарные операции на CompareExchange сразу же
Если на Яве, я бы сделал объект с двумя полями, имя и статус, при изменении статуса синхронизировался бы целиком на объекте и менял статус. Ну а хранил бы уже как удобнее для задачи. Или по статусу или по имени.
В джаве так оно и было бы, да. Просто в Котлине есть более интересные решения. одно из которых корутины. даже не задумывался о том, разные там потоки или нет 🙂 Вроде как корутины работают в главном потоке
корутины работают в своем пуле потоков, может быть несколько, а может быть один (как например Dispatchers.Main)
Я потому и задал вопрос по корутины, что не уверен. Если все они будут в одном потоке, то вообще ничего придумывать не нужно, взял и поменял. Но я бы на это не рассчитывал и оставил как в Яве. А то поменяют поведение по умолчанию и все...
Обсуждают сегодня