Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Потокобезопасность / 22 сообщений из 22, страница 1 из 1
05.10.2015, 14:04
    #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
05.10.2015, 14:45
    #39068463
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
Какая задача стоит? Что в вашем понятии потокобезопасно?
Удалить одну запись из мапы легко - всего лишь надо вызвать remove(key). Очистить все, так чтобы ни один поток не вклинился, с ConcurrentHashMap у вас не получится, эта структура данных не подходит для этой задачи.
...
Рейтинг: 0 / 0
05.10.2015, 15:03
    #39068478
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
Задача, удалить записи с определенным значением.
Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все.
...
Рейтинг: 0 / 0
05.10.2015, 15:08
    #39068491
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
HettВсем привет, продолжаю осваивать яву,
есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap


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

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

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

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

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


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

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

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

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

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

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


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

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

а ту ли структуры данных Вы выбрали?
...
Рейтинг: 0 / 0
05.10.2015, 21:32
    #39068834
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
Может и не ту.
В основном по ключу доступ, но иногда и по значению надо найти и удалить.
...
Рейтинг: 0 / 0
05.10.2015, 23:07
    #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
06.10.2015, 08:18
    #39068965
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
Как я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись
...
Рейтинг: 0 / 0
06.10.2015, 10:25
    #39069054
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потокобезопасность
HettКак я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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