Я ищу эффективную систему, в которой будет иерархически организована серия блокировок чтения / записи для управления доступом к иерархически организованным ресурсам. Если поддерево заблокировано для записи, то во всем поддереве нельзя получить другую блокировку, пока оно не будет снято; аналогично блокировка записи в поддереве должна предотвращать блокировку родительского элемента.
Вот идеи, которые я обдумывал:
Используйте транзакцию Apache Commons . К сожалению, проект не обновлялся с марта 2008 года и неофициально закрыт. Некоторые документы API, казалось, указывают на то, что будущая версия (1.3 или 2.0) будет включать какую-то иерархическую блокировку , но источников нигде нет, и кажется, что мы не можем получить доступ к их репозиторию SVN. подробнее.
Используйте серию ReentrantReadWriteLock
s , которые я бы организовал иерархически. Я не эксперт по параллелизму и немного боюсь делать это самостоятельно. Предварительные мысли, казалось, указывали на то, что даже до того, как я смогу попытаться заблокировать поддерево, мне придется использовать внешнюю блокировку для всей структуры, управляющей самими ReentrantReadWriteLock
, так что даже для выпуска lock Мне пришлось бы использовать внешнюю блокировку…
Использовать классы из java.util.concurrent
и java.util.concurrent.atomic
для реализации моей иерархической блокировки более эффективным способом, чем я мог бы сделать с серией ReentrantReadWriteLock
s.
Я готов пойти по этому последнему пути, но я был удивлен, не обнаружив какой-либо существующей библиотеки, которая решила бы эту проблема лучше. Итак: