искать решение для развития мьютекса - PullRequest
0 голосов
/ 28 декабря 2011

Я ищу решение для следующей проблемы:

Я разрабатываю Java-класс, который содержит карту, которой манипулируют несколько потоков. Эти потоки будут иметь следующие операции:

  1. Итерация: будет итерация карты, итерация будет считывать и обновлять значения некоторых записей
  2. положено: одна из веток добавит записи на карту
  3. get: один или несколько потоков будут периодически читать карту

Сложная часть: can't Я не могу поставить мьютекс на все 3 метода, потому что итерация вызовет get и put, что приведет к мертвой блокировке.

Посоветуйте, пожалуйста, как мне спроектировать класс и мьютекс, чтобы он работал.

Спасибо

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Мьютекс, полученный при использовании ключевого слова synchronized, является реентерабельным, поэтому, если итерация уже владеет мьютексом, он может повторно получить то же самое при вызове get и put.

Тем не менее, я бы создал поле участника вашей карты как ConcurrentHashMap. Тогда у вашего iterate не будет проблем ConcurrentModificationException (более подробную информацию смотрите в javadocs класса ConcurrentHashMap). Аналогично блокировка для get и put будет обработана для вас ConcurrentHashMap.

1 голос
/ 28 декабря 2011

Есть и другие способы скина кота, классический способ - использовать незащищенные приватные методы get / put из итерации, публичные методы get / set оборачивают это в блокировку мьютекса

...