Освободить несколько блокировок атомарно в Java - PullRequest
1 голос
/ 10 сентября 2009

Если я приобрел несколько блокировок, как я могу разблокировать Набор блокировок атомарно?

Ответы [ 3 ]

5 голосов
/ 10 сентября 2009

Я озадачен, почему вам нужно выпускать их атомарно. Получение их атомарно, я мог бы понять, хотя код для этого был бы странным чудовищем - одним из чистых способов было бы скрыть их от всего кода за главным диспетчером блокировок и синхронизировать их. Но какой код будет заботиться о том, чтобы две блокировки были сняты одновременно или вообще ни одной?

2 голосов
/ 10 сентября 2009

Поскольку блокировки обрабатываются как независимые объекты (см. этот вопрос ), а язык Java (пока, насколько мне известно) не предоставляет метод в своей JVM (где он должен быть реализован быть действительно атомарным) снять несколько блокировок за один шаг, просто невозможно.

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

2 голосов
/ 10 сентября 2009

Взгляните на описание пакета java.util.concurrent в JDK, возможно, там вы найдете подходящий синхронизатор primitibe. Информации в вашем вопросе недостаточно, чтобы дать более конкретный ответ.

Один простой подход (но, возможно, не самый эффективный) состоит в том, чтобы использовать 'uberLock' для защиты всех необходимых блокировок, например ::100100

private final Lock uberLock = new ReentrantLock();
void lockAll() {
    uberLock.lock();
    try {
        // call lock() on all needed locks
    } finally {
        uberLock.unlock();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...