Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка обращений к коллекции 
V
    Опции темы
novichiok
Дата 25.10.2011, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.9.2011

Репутация: нет
Всего: нет



Здравствуйте.
    У меня такая проблема: В приложении множество потоков бегают случайный образом по MultiValueMap у которой в качестве value используется какой-то Collection. Эти потоки берут из Map'а коллекцию, извлекают из неё элемент,удаляют его из коллекции и обрабатывают. Если коллекция пустая то поток сабмитит таск на обновления коллекции для данного ключа в спец. пул. Этот пул содержит единственный поток, который и обновляет коллекции по ключу. Проблема заключается в том, что возможна такая ситуация когда несколько потоков достают по ключу одну и ту же коллекцию,она оказывается пустая, и сабмитят по сути один и тот-же таск на обновление. Я хочу этого избежать.Грубо говоря хотелось бы чтобы все выглядело так:
Код

Collection coll = myMap.getCollection(key);
if(coll.isLocked()) {
// Коллекция залочена, следовательно её не трогаем а переходим к коллекции для другого ключа

if(coll.isEmty()) {
coll.lock()// блокируем коллекцию чтобы никакой другой поток не мог к ней    
//обратиться, следовательно не мог получить для ней isEmpty() и засабмитить 
//таск на выполнение
pool.submit(new MyTask(coll));
}

Так будет происходить в потоках-обработчиках. А в потоке обновителе что-то в этом роде:
Код

...
//Обносвили коллекцию
coll.unLock(); // Сняли блокировку,теперь потоки обработчики снова могут обращаться к коллекции


Вопрос: как такой функционал реализовать правильно? (отнаследоваться от какой-то коллекции и сделать volatile флаг lock. как-то сильно просто) + Учитывая специфику задачи посоветуйте,пожалуйста, collection для мапа? Беря во внимание что из коллекции элементы нужно удалять, как-то не хочется использовать для таких целей ArrayList, из-за возможных тормозов с System.arrayCopy(...)

PM MAIL   Вверх
Stolzen
Дата 25.10.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Думаю, что можно использовать ReentrantReadWriteLock, если я правильно все понял.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
novichiok
Дата 25.10.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.9.2011

Репутация: нет
Всего: нет



Ну я тоже так думал. А затем нашел одну лазейку,из-за которой отказался отеё использования, а именно - у меня ведь главная цель не допустить сабмита одинаковых тасков в пул(тасков на обновление одной и той же коллекции), и вот предположим ситуацию :
- у меня *читающие* обращения к коллекции синхронизируются readLock'ом из readWriteLock()
- *пишущие* writeLock'ом.
Теперь предположим что 1 поток читает из очереди, обнаруживает что она пустая - сабмитит таск на выполенение, затем сразу же 2 поток опять читает из той же очереди и опять -она пустая, сабмитит таск на выполнение. Дело в том что есть *большая* вероятность того, что 2 поток-обработчик будет отрабатывать раньше чем *пишущий* таск из пула. ведь для того чтоб 2поток обработчик не смог даже читать из коллекции, для начала таск из пула должен начать в неё писать, тем самым залочив её даже на чтение. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.