powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Lock для пользователя.
25 сообщений из 26, страница 1 из 2
Lock для пользователя.
    #39087764
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой оптимальный способ получить блокировку на действие пользователя?
Иначе говоря, как если бы замок(lock) был для каждого пользователя объекта свой.


Что-то вроде:
Код: java
1.
2.
3.
4.
5.
6.
method() {

lock.lockByUser(userId)

lock.unlock()
}



или
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ConcurrentMap<Long, AtomicBoolean> locks = new ConcurrentMap<>();

method() {

AtomicBoolean at= locks.get(userId)

if(at.compareAndSet(false, true)) {

//do
}


}
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39087834
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39087852
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, а что если использовать ConcurrentMap c AtomicBoolean.compareAndSet()? Плохо?
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39087855
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmBlazkowicz, а что если использовать ConcurrentMap c AtomicBoolean.compareAndSet()? Плохо?

А он то и не нужен. Методы уже есть в ConcurrentMap. Достаточно просто держать в мапе текущие блокировки, а не вообще всех пользователей. И, кстати, ConcurrentMap это интерфейс.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088001
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, т.е например
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ConcurrentMap<Long, Object> locks = new ConcurrentMap<>();

//..

method() {
if(locks.putIfAbsent(userId, new Object()) == null) {

//to do

}
}
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088014
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,

Да, при этом не забывать удалять в finally блоке. Ну, и создавать новый объект смысла нет, можно то же userId в value положить.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088018
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088047
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, ваше последнее сообщение к этому?


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Set<Long> locks= Collections.newSetFromMap(
        new ConcurrentHashMap<Long, Boolean>());

//...

method() {

       if(locks.add(userId)) {
            try {  
               //to do
           } finally {
             locks.remove(userId)
           }
        }
}
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088057
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm if(locks.add(userId)) {

Гоню. Методы ConcurrentMap нужны же.
Тогда остаётся lock.putIfAbsent(userId, userId)
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088143
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, я вот подумал, а чем плох просто add(ConcurrentSet). Т.е. проверка add(userId) == true ?
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088154
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmBlazkowicz, я вот подумал, а чем плох просто add(ConcurrentSet). Т.е. проверка add(userId) == true ?
А и правда. Тоже должно работать.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088187
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, в этом случае оптимальной реализацией Set будет

Код: java
1.
2.
Set<Long> locks= Collections.newSetFromMap(
        new ConcurrentHashMap<Long, Boolean>());



а не ConcurrentSkipListSet, CopyOnWriteArraySet?
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088201
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,

Оптимальность это понятие субъективное. Уверен что в вашем случае будет глубоко фиолетово.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088239
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо за ответы!
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088609
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdm, а можете по простому написать, что вы хотите делать? Просто интересно стало, что в этой ветке разбираете :)
rdmКакой оптимальный способ получить блокировку на действие пользователя?
Иначе говоря, как если бы замок(lock) был для каждого пользователя объекта свой.

Типа прав (имеет доступ к определенному экшену или нет) на каждое действие? Или что?
Спасибо!
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088841
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,

Запретить одному и тому же пользователю определенное действие конкурентно из разных потоков.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39088972
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczqi_ip,

Запретить одному и тому же пользователю определенное действие конкурентно из разных потоков.
Благодарю за коммент ;)
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089315
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip, Blazkowicz ответил.
Допустим есть метод А и метод Б. Надо что бы пользователь не мог выполнять одновременно и А и Б.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089388
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
Ты лучше объясни, как у тебя юзверь конкурирует сам с собой.
Обычно в веб стараются даже разных юзверей не сталкивать.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089391
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, хибер просто послал сложности подальше и сказал что обеспечивает изолированность только сессионную. Т.е одна сессия - нефиг конкурировать.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089396
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя наверно свой сервер пишем. Тогда да.
Imho
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089530
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, к примеру, послал пользователь одновременно два запроса на сервер вот и конкурирует.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089552
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdmPetro123, к примеру, послал пользователь одновременно два запроса на сервер вот и конкурирует.
если абстрактно, сервер - это СУБД, то на пользователя даётся новый экземпляр соединения (коннект), если он способен нажать одновременно 2 кнопки физически.
Если не способен и разные, то пул или ГУИ не отожмёт кнопку пока первый не выполнится.
Т.е. на любую блокировку нужно обслуживание и обвязка:
Польз - ГУИ - Соединение - Сервер
На каком этапе мы тут блокируем большой вопрос.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39089742
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm
Как тебе правильно посоветовали
Petro123Польз - ГУИ - Соединение - Сервер
На каком этапе мы тут блокируем большой вопрос.
Тут надо пояснить, что ситуации бывают разные.
Например, у тебя полный RESTFull головного мозга и балансировщик нагрузки про это в курсе и посылает запросы от одного ip на разные узлы кластера. То сам бог велел получить блокировку из некого общего менеджера транзакций (ну если сервер приложений без него, то взять у БД, или еще у какого-то объекта).
Если же все обрабатывается в одном контейнере кофе машины, то можно подумать про ее блокировки (synchronized блоки, reentrant lock и т.п. в зависимости от предполагаемой нагрузки и конкуренции).
Блокировать в web гуе не рекомендую - пользователи они же не дураки, они завсегда знают как открыть одну и ту же страничку в разных окнах браузера и асинхронно жамкнуть на кнопку.
...
Рейтинг: 0 / 0
Lock для пользователя.
    #39090484
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев, Petro123 собственно, решение уже есть выше
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Lock для пользователя.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]