![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
novichiok |
|
||||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Здравствуйте.
У меня такая проблема: В приложении множество потоков бегают случайный образом по MultiValueMap у которой в качестве value используется какой-то Collection. Эти потоки берут из Map'а коллекцию, извлекают из неё элемент,удаляют его из коллекции и обрабатывают. Если коллекция пустая то поток сабмитит таск на обновления коллекции для данного ключа в спец. пул. Этот пул содержит единственный поток, который и обновляет коллекции по ключу. Проблема заключается в том, что возможна такая ситуация когда несколько потоков достают по ключу одну и ту же коллекцию,она оказывается пустая, и сабмитят по сути один и тот-же таск на обновление. Я хочу этого избежать.Грубо говоря хотелось бы чтобы все выглядело так:
Так будет происходить в потоках-обработчиках. А в потоке обновителе что-то в этом роде:
Вопрос: как такой функционал реализовать правильно? (отнаследоваться от какой-то коллекции и сделать volatile флаг lock. как-то сильно просто) + Учитывая специфику задачи посоветуйте,пожалуйста, collection для мапа? Беря во внимание что из коллекции элементы нужно удалять, как-то не хочется использовать для таких целей ArrayList, из-за возможных тормозов с System.arrayCopy(...) |
||||
|
|||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Думаю, что можно использовать ReentrantReadWriteLock, если я правильно все понял.
|
|||
|
||||
novichiok |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 15.9.2011 Репутация: нет Всего: нет |
Ну я тоже так думал. А затем нашел одну лазейку,из-за которой отказался отеё использования, а именно - у меня ведь главная цель не допустить сабмита одинаковых тасков в пул(тасков на обновление одной и той же коллекции), и вот предположим ситуацию :
- у меня *читающие* обращения к коллекции синхронизируются readLock'ом из readWriteLock() - *пишущие* writeLock'ом. Теперь предположим что 1 поток читает из очереди, обнаруживает что она пустая - сабмитит таск на выполенение, затем сразу же 2 поток опять читает из той же очереди и опять -она пустая, сабмитит таск на выполнение. Дело в том что есть *большая* вероятность того, что 2 поток-обработчик будет отрабатывать раньше чем *пишущий* таск из пула. ведь для того чтоб 2поток обработчик не смог даже читать из коллекции, для начала таск из пула должен начать в неё писать, тем самым залочив её даже на чтение. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |