|
|
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Всем привет, продолжаю осваивать яву, есть вопрос, хочу потокобезопасно удалить данные из 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. До того как я озаботился проблемой, было так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вопрос в том, не нагородил ли я лишнего, и будет ли это стабильно работать в условиях большой нагрузки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 14:04 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Какая задача стоит? Что в вашем понятии потокобезопасно? Удалить одну запись из мапы легко - всего лишь надо вызвать remove(key). Очистить все, так чтобы ни один поток не вклинился, с ConcurrentHashMap у вас не получится, эта структура данных не подходит для этой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 14:45 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Задача, удалить записи с определенным значением. Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 15:03 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
HettВсем привет, продолжаю осваивать яву, есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap ConcurrentHashMap - Это lock free структура данных - по определению потокобезопасно не полусится ... можно попробовать так : Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 15:08 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
UPD сорри не так написал ... если вы ходите гарантий на чтение после удаления итд ... Atum1HettВсем привет, продолжаю осваивать яву, есть вопрос, хочу потокобезопасно удалить данные из ConcurrentHashMap ConcurrentHashMap - Это lock free структура данных - по определению потокобезопасно не полусится ... можно попробовать так : Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 15:09 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
HettЗадача, удалить записи с определенным значением. Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все. Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 15:27 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
забыл никHettЗадача, удалить записи с определенным значением. Потоки пусть вклиниваются, 2 разных поток могут запросить удаление одного и того же ключа одновременно, в таком случае просто удалить ключи и все. Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent Нужно удалить по значению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 19:20 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Hettзабыл никпропущено... Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent Нужно удалить по значению. а ту ли структуры данных Вы выбрали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 21:13 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Может и не ту. В основном по ключу доступ, но иногда и по значению надо найти и удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 21:32 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Hettзабыл никпропущено... Зачем тогда этот адский код? В CM есть методы remove(key) и clear(), которые eventually-consistent Нужно удалить по значению. Тогда что вас не устраивает в первоначальном варианте? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. CM кидает нуллпоинтер на ремуве только когда переданный key == null, а это уже само по себе ошибка, такого быть не должно, но если уж совсем хотите без эксепшенов то добавьте эту проверку e.getKey() != null перед вызовом release. Оффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2015, 23:07 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Как я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 08:18 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
HettКак я понимаю, между проверкой key == null и выполнением действия может вмешаться другой поток и удалить запись Ну и что? remove(key, expected) отработает корректно, вернув false. Почитайте здесь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 10:25 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
забыл никОффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design. Не понял Вашего посыла, если честно. static у TC - простейший вид singleton. volatile ссылки на объект никак не коррелирует с тем, что из себя представляет объект. Вопрос к TC - нафига весь огород, если remove и так проверяет тот ли объект пытаемся удалить? Чтоб сделать масло еще масленее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 10:43 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевзабыл никОффтопик. static volatile излишни возле обьявления СМ и зачем вы все методы делаете статическими, очень похоже на bad design. Не понял Вашего посыла, если честно. static у TC - простейший вид singleton. volatile ссылки на объект никак не коррелирует с тем, что из себя представляет объект. Вопрос к TC - нафига весь огород, если remove и так проверяет тот ли объект пытаемся удалить? Чтоб сделать масло еще масленее? Когда начинал программировать на java, везде лепил static, я думаю у ТС то же самое, да и синглтон вещь достаточно спорная, но если надо - то ок. Насчет volatile - она там 200% не нужна, тем более если это сингтон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 12:40 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
С удалением действительно намудрил чего-то, первоначальный вариант нормально работал и будет работать. static, потому что у половина программы в мейн классе. Чем это плохо? Переменная используется в разных потоках, разве volatile это не тот самый случай? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 14:45 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Hett, volatile вообще не про многопоточность, он про кэширование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 15:28 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
HettС удалением действительно намудрил чего-то, первоначальный вариант нормально работал и будет работать. static, потому что у половина программы в мейн классе. Чем это плохо? Ну не так уж и плохо. Если это утилита вообще нормально. Если продакшен приложение - я бы обернул все в какой-нибудь сервис, сделал спринговым-бином и инжектил куда надо. HettПеременная используется в разных потоках, разве volatile это не тот самый случай? Volatile нужен если значение переменной меняется разными потоками, и вам всегда нужно свежее. В вашем случае CM создается один раз, при classloading, после этого ссылка будет одна и та же и можно не беспокоится. А вот контент мапы меняется, да. Но она сама следит чтобы он был актуальный для разных потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2015, 15:57 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
забыл никНасчет volatile - она там 200% не нужна, тем более если это сингтон. Если я чего не путаю, то volatile не мешает многопоточности и в качестве бонуса добавляет например фичу с тем, что из второго потока методы мапы не вызовутся раньше, чем закончит работать ее конструктор. Все ж таки не final поле. А хуже не сделает. Volatile это не "нужно свежее", это нужно самосогласованное. Упрощенно говоря - при чтении младшие биты будут от той же операции записи, что и старшие (и тем самым добавятся h-b грани - как следствие воспользоваться адресом до окончании инициализации не получится). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 12:38 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевзабыл никНасчет volatile - она там 200% не нужна, тем более если это сингтон. Если я чего не путаю, то volatile не мешает многопоточности и в качестве бонуса добавляет например фичу с тем, что из второго потока методы мапы не вызовутся раньше, чем закончит работать ее конструктор. Все ж таки не final поле. Если это синглтон, то по определению мапа должна быть корректно инициализирована в конструкторе, какие нафиг другие потоки? Сергей АрсеньевА хуже не сделает. Ага, мемори барьер при каждом доступе и все оптимизации JIT идут лесом. Сергей АрсеньевVolatile это не "нужно свежее", это нужно самосогласованное. Упрощенно говоря - при чтении младшие биты будут от той же операции записи, что и старшие (и тем самым добавятся h-b грани - как следствие воспользоваться адресом до окончании инициализации не получится). При чем тут все это? Красное это красное, да. Очевидно, что ТС влепил volatile не подумав, это распространенная ошибка, когда начинаешь осваивать многопоточность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 13:21 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
забыл ник, Еще раз - final нет, значит может меняться. Второе этот барьер и не дает оптимизатору сделать вызов метода раньше окончания конструктора. Частный случай. При singleton - нужно один раз и, возможно, лучше final. При не постоянном объекте - каждый раз при смене оного, тогда volatile. Надо проделать кучу действий с одним и тем же экземпляром полученным по volatile ссылке, чтобы оптимизатор что-то там - используй локальную переменную. Как-то мне казалось так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 14:20 |
|
||
|
Потокобезопасность
|
|||
|---|---|---|---|
|
#18+
В данном простом учебном примере вообще все IMHO бесполезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2015, 14:23 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39068834&tid=2124838]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 505ms |

| 0 / 0 |
