LINUX.ORG.RU

Многопоточность.

 ,


0

2

Никак не могу разобраться. Есть класс А. В нем есть вложенные классы B и C. В классе А в поле хранится потокозащищенная ConcurrentHashMap. Классы B и C - Runnable и куча их инстансов крутятся и в методе run переписывают данные в этой мапе класса А. Всё это делается в мониторе

...run() {
  synchronized (mymap) {
    if (mymap.containsKey(somekey)) {
      mymap.remove(somekey);
      mymap.put(newkey, this);
    }
  }
}

Этот кусок кода идентичен в классах B и C. Почему-то при входе в монитор (казалось бы), остальные инстансы потоков не останавливаются. В чем может быть дело, кто сталкивался?

Не надо использовать ConcurrentHashMap в качестве лока.

Впрочем не останавливаются они по какой-то другой причине

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom

Но монитор на месте, мне непонятно такое поведение в принципе.

Insomnium ★★★★ ()
Ответ на: комментарий от maxcom

Кстати, что в таком случае стоит лучше делать? Создавать объект Lock и вызывать блокировку по нему?

Insomnium ★★★★ ()
Ответ на: комментарий от Insomnium

Я ж не знаю какой у тебя случай. Имхо если ты все операции оборачиваешь Lock'ом, то ConcurrentHashMap тебе не нужен.

А с другой стороны есть методы вроде putIfAbsent и replace которые не требуют внешних локов, но в тебе напрямую они не подходят

maxcom ★★★★★ ()
Ответ на: комментарий от Insomnium

почему ты кстати думаешь что они не останавливаются?

maxcom ★★★★★ ()

Не может быть такого, что экземпляр ConcurrentHashMap в В и С разный?

nanoolinux ★★★★ ()
Ответ на: комментарий от nanoolinux

Для них это поле внешнего класса, к которому они напрямую обращаются.

Insomnium ★★★★ ()
Ответ на: комментарий от Insomnium

что значит переписываются? что код делает?

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom

Код проверяет нет ли в Map'е инстанса с объектом Point с заданными координатами. (Point - ключ). Если есть - ничего не делаем, если нет - пишем себя же в Map с новыми координатами, а старый инстанс себя из Map удаляем.

Insomnium ★★★★ ()
Ответ на: комментарий от Insomnium

так что не так работает?

глупый вопрос, но все же в Point определены equals & hashCode ?

maxcom ★★★★★ ()
Ответ на: комментарий от Insomnium

java.awt.Point кстати mutable, его надо акуратно использовать в качестве ключа

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom

Я уже в коде, честно говоря, запутался. Сейчас переписал все критические участки - сам лучше разобрался в коде и некоторые вещи стали понятнее. Осталась последняя проблема - где-то B асинхронно работает с C. Спасибо за ответы, буду дальше курить многопоточность.

Insomnium ★★★★ ()

Кстати, решено было путем лока внешнего класса, как и завещала документация. (Оставлю здесь на память)

Insomnium ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.