Глобальная блокировка для Полосатой блокировки из библиотеки GUAVA - PullRequest
0 голосов
/ 05 декабря 2018

Я использую в проекте чередующиеся блокировки из 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()
    }
}

Этот код работает хорошо, обеспечивает правопорядок данных.Но я хочу получить глобальную блокировку (монопольный доступ) к текущему объекту для модификации некоторых данных.Поэтому я хочу прекратить получать блокировки для всех уникальных идентификаторов, пока я не изменю данные.

Возможные решения:

  1. Я могу использовать ReasWriteLock до получения чередующейся блокировки.(чтение - для «locks.get (id)», запись - для монопольного доступа) - Неверное решение, дополнительная блокировка в нормальном состоянии.
  2. Я могу использовать одну блокировку для всех, но это замедлит работу приложения
  3. Глобальная блокировка

Пример:

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()
}

Я думаю, что решение с глобальной блокировкой выглядит не очень хорошо (флаги, блокировка, двойная проверка и т. Д.)

Вопрос: Можете ли вы посоветовать любое решение, которое может помочь мне решить эту проблему?Или можете подсказать какую-нибудь идею?

Спасибо

...