Я использую в проекте чередующиеся блокировки из GUAVA для синхронизации входных данных для каждого уникального идентификатора процесса, он обеспечивает правильный порядок данных для последующей обработки этих данных.
Striped<Lock> locks = Striped.lazyWeakLock(10);
public void put(String id, String data) {
Lock lock = locks.get(id);
lock.lock()
try {
// process data
} finally {
lock.unlock()
}
}
Этот код работает хорошо, обеспечивает правопорядок данных.Но я хочу получить глобальную блокировку (монопольный доступ) к текущему объекту для модификации некоторых данных.Поэтому я хочу прекратить получать блокировки для всех уникальных идентификаторов, пока я не изменю данные.
Возможные решения:
- Я могу использовать ReasWriteLock до получения чередующейся блокировки.(чтение - для «locks.get (id)», запись - для монопольного доступа) - Неверное решение, дополнительная блокировка в нормальном состоянии.
- Я могу использовать одну блокировку для всех, но это замедлит работу приложения
- Глобальная блокировка
Пример:
if (locked) {
global.lock()
global.unlock()
Lock lock = locks.get(id);
...
} else {
Lock lock = locks.get(id);
if (locked){
...
}
lock.lock();
}
void extraLock(){
global.lock();
locked = true;
// modify data
locked = false;
global.unlock()
}
Я думаю, что решение с глобальной блокировкой выглядит не очень хорошо (флаги, блокировка, двойная проверка и т. Д.)
Вопрос: Можете ли вы посоветовать любое решение, которое может помочь мне решить эту проблему?Или можете подсказать какую-нибудь идею?
Спасибо