powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Потокобезопасность
22 сообщений из 22, страница 1 из 1
Потокобезопасность
    #39068414
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, продолжаю осваивать яву,
есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
   
    static volatile ConcurrentHashMap<String, String> locks = new ConcurrentHashMap<>();

    public static void release(String lockName, String owner) {
        if (locks.remove(lockName, owner)) {
            locksReleased++;
        }
    }
     
    public static void removeAllLocks(String owner) {
        if (owner == null)
            return;

        Iterator<String> i = locks.keySet().iterator();
        while(i.hasNext()) {
            String key = i.next();
            try {
                String value = locks.get(key);
                if(value.equals(owner)) {
                    release(key, value);
                }
            } catch (NullPointerException e) {}
        }
    }



До того как я озаботился проблемой, было так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public static void removeAllLocks(String owner) {
        if (owner == null)
            return;

        for (Map.Entry<String, String> e : locks.entrySet()) {
            if(e.getValue().equals(owner)) {
                release(e.getKey(), owner);
            }
        }
    }



Вопрос в том, не нагородил ли я лишнего, и будет ли это стабильно работать в условиях большой нагрузки?
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068463
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая задача стоит? Что в вашем понятии потокобезопасно?
Удалить одну запись из мапы легко - всего лишь надо вызвать remove(key). Очистить все, так чтобы ни один поток не вклинился, с ConcurrentHashMap у вас не получится, эта структура данных не подходит для этой задачи.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068478
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача, удалить записи с определенным значением.
Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068491
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettВсем привет, продолжаю осваивать яву,
есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap


ConcurrentHashMap - Это lock free структура данных - по определению потокобезопасно не полусится ...

можно попробовать так :

Код: java
1.
 Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068492
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPD сорри не так написал ...

если вы ходите гарантий на чтение после удаления итд ...

Atum1HettВсем привет, продолжаю осваивать яву,
есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap


ConcurrentHashMap - Это lock free структура данных - по определению потокобезопасно не полусится ...

можно попробовать так :

Код: java
1.
 Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068520
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЗадача, удалить записи с определенным значением.
Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все.

Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068756
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никHettЗадача, удалить записи с определенным значением.
Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все.

Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent

Нужно удалить по значению.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068824
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hettзабыл никпропущено...


Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent

Нужно удалить по значению.

а ту ли структуры данных Вы выбрали?
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068834
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может и не ту.
В основном по ключу доступ, но иногда и по значению надо найти и удалить.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068866
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettзабыл никпропущено...


Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent

Нужно удалить по значению.

Тогда что вас не устраивает в первоначальном варианте?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public static void removeAllLocks(String owner) {
        if (owner == null)
            return;

        for (Map.Entry<String, String> e : locks.entrySet()) {
            if(e.getValue().equals(owner)) {
                release(e.getKey(), owner);
            }
        }
    }



CM кидает нуллпоинтер на ремуве только когда переданный key == null, а это уже само по себе ошибка, такого быть не должно, но если уж совсем хотите без эксепшенов то добавьте эту проверку e.getKey() != null перед вызовом release.

Оффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39068965
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069054
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettКак я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись

Ну и что? remove(key, expected) отработает корректно, вернув false.

Почитайте здесь .
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069080
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никОффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design.
Не понял Вашего посыла, если честно.
static у TC - простейший вид singleton.
volatile ссылки на объект никак не коррелирует с тем, что из себя представляет объект.

Вопрос к TC - нафига весь огород, если remove и так проверяет тот ли объект пытаемся удалить? Чтоб сделать масло еще масленее?
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069253
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевзабыл никОффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design.
Не понял Вашего посыла, если честно.
static у TC - простейший вид singleton.
volatile ссылки на объект никак не коррелирует с тем, что из себя представляет объект.

Вопрос к TC - нафига весь огород, если remove и так проверяет тот ли объект пытаемся удалить? Чтоб сделать масло еще масленее?

Когда начинал программировать на java, везде лепил static, я думаю у ТС то же самое, да и синглтон вещь достаточно спорная, но если надо - то ок.
Насчет volatile - она там 200% не нужна, тем более если это сингтон.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069459
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С удалением действительно намудрил чего-то, первоначальный вариант нормально работал и будет работать.
static, потому что у половина программы в мейн классе. Чем это плохо?

Переменная используется в разных потоках, разве volatile это не тот самый случай?
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069517
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

volatile вообще не про многопоточность, он про кэширование.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39069558
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettС удалением действительно намудрил чего-то, первоначальный вариант нормально работал и будет работать.
static, потому что у половина программы в мейн классе. Чем это плохо?

Ну не так уж и плохо. Если это утилита вообще нормально. Если продакшен приложение - я бы обернул все в какой-нибудь сервис, сделал спринговым-бином и инжектил куда надо.
HettПеременная используется в разных потоках, разве volatile это не тот самый случай?

Volatile нужен если значение переменной меняется разными потоками, и вам всегда нужно свежее. В вашем случае CM создается один раз, при classloading, после этого ссылка будет одна и та же и можно не беспокоится. А вот контент мапы меняется, да. Но она сама следит чтобы он был актуальный для разных потоков.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39071826
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНасчет volatile - она там 200% не нужна, тем более если это сингтон.
Если я чего не путаю, то volatile не мешает многопоточности и в качестве бонуса добавляет например фичу с тем, что из второго потока методы мапы не вызовутся раньше, чем закончит работать ее конструктор. Все ж таки не final поле. А хуже не сделает.

Volatile это не "нужно свежее", это нужно самосогласованное. Упрощенно говоря - при чтении младшие биты будут от той же операции записи, что и старшие (и тем самым добавятся h-b грани - как следствие воспользоваться адресом до окончании инициализации не получится).
...
Рейтинг: 0 / 0
Потокобезопасность
    #39071894
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевзабыл никНасчет volatile - она там 200% не нужна, тем более если это сингтон.
Если я чего не путаю, то volatile не мешает многопоточности и в качестве бонуса добавляет например фичу с тем, что из второго потока методы мапы не вызовутся раньше, чем закончит работать ее конструктор. Все ж таки не final поле.
Если это синглтон, то по определению мапа должна быть корректно инициализирована в конструкторе, какие нафиг другие потоки?
Сергей АрсеньевА хуже не сделает.

Ага, мемори барьер при каждом доступе и все оптимизации JIT идут лесом.

Сергей АрсеньевVolatile это не "нужно свежее", это нужно самосогласованное. Упрощенно говоря - при чтении младшие биты будут от той же операции записи, что и старшие (и тем самым добавятся h-b грани - как следствие воспользоваться адресом до окончании инициализации не получится).
При чем тут все это? Красное это красное, да. Очевидно, что ТС влепил volatile не подумав, это распространенная ошибка, когда начинаешь осваивать многопоточность.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39071975
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Еще раз - final нет, значит может меняться.

Второе этот барьер и не дает оптимизатору сделать вызов метода раньше окончания конструктора. Частный случай. При singleton - нужно один раз и, возможно, лучше final.
При не постоянном объекте - каждый раз при смене оного, тогда volatile.

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

Как-то мне казалось так.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39071980
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном простом учебном примере вообще все IMHO бесполезно.
...
Рейтинг: 0 / 0
Потокобезопасность
    #39072431
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да понятно, если ссылка будет меняться, то необходимо, если нет, то зря производительность теряется.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Потокобезопасность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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