Моя цель - синхронизировать доступ к нескольким() объектам, внешним по отношению к программе. ReentrantReadWriteLock
представляет собой хорошую модель для управления объектом только. Однако в моем случае было бы безумным создание объекта RWL для каждого синхронизированного объекта. К счастью, менее сто из них будут доступны в тот же момент.Dynamic ReentrantReadWriteLock-s для синхронизации доступа к большому количеству объектов
Таким образом, я решил создать сервис, который предоставляет интерфейс, как это:
void acquireReadLock(String id) {
rwl = ....... // get or create RWL object
rwl.writeLock().lock();
}
void acquireWriteLock(String id) {
}
void releaseReadLock(String id) {
}
void releaseWriteLock(String id) {
}
Внедрение методов «захватит» использует простой ленивый инициализацию instaniate объект RWL для элемента, или получить его из кэша. Однако методы «выпуска» должны включать дополнительную логику, которая проверяет, требуется ли RWL (= не имеет блокировок). Если нет, я могу безопасно удалить RWL из кеша, иначе память скоро будет залита ими.
Чтобы реализовать эту логику очистки, мне нужен способ выполнить соответствующие проверки. Методы «getReadLockCount()» и «isWriteLocked()» кажутся подходящими кандидатами, но это qoute от JavaDoc меня беспокоит много:
Этот метод предназначен для использования в состоянии системы мониторинга, а не для контроля синхронизации.
Итак, безопасно ли использовать их для выполнения моей задачи? Возможно ли другое решение?
Вы уверены, что создание тысяч 'ReentrantReadWriteLock' создает проблему?ИМХО вы должны иметь возможность создавать миллионы из них без негативного воздействия на JVM –
Тысячи - это типичное количество. В конечном итоге сумма в основном не ограничена, но RAM нет, даже если JVM может обрабатывать их все одновременно. –
Что делать, если я пытаюсь выполнить tryLock()? Если это удастся, это означает, что никто не имеет блокировки любого типа. Затем я могу безопасно удалить RWL из списка. На данный момент я не вижу никаких побочных эффектов. –