Какую стратегию использовать в Java для иерархической реентерабельной блокировки чтения / записи?

Я ищу эффективную систему, в которой будет иерархически организована серия блокировок чтения / записи для управления доступом к иерархически организованным ресурсам. Если поддерево заблокировано для записи, то во всем поддереве нельзя получить другую блокировку, пока оно не будет снято; аналогично блокировка записи в поддереве должна предотвращать блокировку родительского элемента.

Вот идеи, которые я обдумывал:

  • Используйте транзакцию Apache Commons . К сожалению, проект не обновлялся с марта 2008 года и неофициально закрыт. Некоторые документы API, казалось, указывают на то, что будущая версия (1.3 или 2.0) будет включать какую-то иерархическую блокировку , но источников нигде нет, и кажется, что мы не можем получить доступ к их репозиторию SVN. подробнее.

  • Используйте серию ReentrantReadWriteLock s , которые я бы организовал иерархически. Я не эксперт по параллелизму и немного боюсь делать это самостоятельно. Предварительные мысли, казалось, указывали на то, что даже до того, как я смогу попытаться заблокировать поддерево, мне придется использовать внешнюю блокировку для всей структуры, управляющей самими ReentrantReadWriteLock , так что даже для выпуска lock Мне пришлось бы использовать внешнюю блокировку…

  • Использовать классы из java.util.concurrent и java.util.concurrent.atomic для реализации моей иерархической блокировки более эффективным способом, чем я мог бы сделать с серией ReentrantReadWriteLock s.

Я готов пойти по этому последнему пути, но я был удивлен, не обнаружив какой-либо существующей библиотеки, которая решила бы эту проблема лучше. Итак:

  • Я пропустил какое-то очевидное решение?
  • Или эту проблему особенно сложно решить должным образом?

7
задан Jean-Philippe Pellet 27 May 2011 в 15:19
поделиться