AbstractQueuedSynchronizer в Java параллельный - PullRequest
8 голосов
/ 10 марта 2012

Для чего используется AbstractQueuedSynchronizer в пакете Java concurrent.locks? Может кто-нибудь пролить свет на его методы doAcquireInterruptibly и parkAndCheckInterrupt?

Ответы [ 3 ]

10 голосов
/ 10 марта 2012

Что такое AbstractQueuedSynchronizer в используемом пакете concurrent.locks для

AbstractQueuedSynchronizer - это строительные блоки для конструкций синхронизации, которые используются и реализуются (как минимум) в пакете java.util.concurrency.

Например, ReentrantLock делегирует Sync, который расширяет AbstractQueuedSynchronizer. Если бы вы написали свой собственный замок, он мог бы выглядеть так:

public class MyLock extends AbstractQueuedSynchronizer implements Lock{
    @Override
    public void lock() {
        super.acquire(1);
    }
    @Override
    public void unlock() {
        if(Thread.currentThread() != super.getExclusiveOwnerThread())
            throw new IllegalMonitorStateException();
        super.release(1);
    }
}

Таким образом, здесь класс MyLock унаследует низкоуровневую функциональность приостановки потока и постановки в очередь в AQS, одновременно обрабатывая любую специальную функциональность (например, эта блокировка требует, чтобы поток, владеющий блокировкой, был тем, который ее снимает, но семафор не ).

Может кто-нибудь пролить свет на его методы, делайте AcquireInterruptibly и parkAndCheckInterrupt

Примечание. Эти методы являются частными для класса, поэтому фактическая функциональность может меняться в зависимости от версии или реализации. По умолчанию я предоставляю следующие функциональные возможности:

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

parkAndCheckInterrupt Просто удобный метод, который будет приостанавливать (парковать) поток, возвращаться при сбросе прерванного статуса.

7 голосов
/ 24 октября 2012
  • AbstractQueuedSynchronizer: предоставляет платформу для реализации блокирующих блокировок и связанных с ними синхронизаторов, таких как семафоры, CountDownLatch и т. Д. Основным алгоритмом получения является попытка получения, при успешном возврате еще один поток в очереди, если он еще не поставлен в очередь, и блокировка текущая тема. Точно так же основной алгоритм освобождения - попытка освобождения, в случае успеха разблокируйте первый поток в очереди, иначе просто верните. Потоки будут ждать в очередях ожидания «первым пришел - первым вышел» (FIFO). Абстрактные методы tryAcquire и tryRelease будут реализованы подклассами в зависимости от их необходимости.

  • doAcquireInterruptibly попытается получить блокировку. Если блокировка уже получена другим потоком, текущий поток будет заблокирован (припаркован). Если он получит блокировку, он просто вернется.

  • parkAndCheckInterrupt будет парковать поток или, другими словами, отключать планирование потока, пока какой-либо другой поток не разблокирует его. Это может произойти из-за снятия блокировки потоком-владельцем или из-за прерывания его каким-либо другим потоком. Если оно прервано каким-либо другим потоком, будет выдано исключение.
3 голосов
/ 11 декабря 2013

Я бы хотел поговорить о AbstractQueuedSynchronizer (AQS) несколькими простыми словами.

Подумайте об этих сценариях в реальном мире:

  • Для пловцов, они могут плавать вместе в бассейне ( совместно ). Но для уборщика, который очистит его с помощью хлора, он должен ждать пока все пловцы не ушли ( эксклюзив ).
  • Для водителей, которые вне оживленной парковки они должны ждать в очереди. Обычно привратник контролирует доступ. Обычная машина займет одно парковочное место. Лимузин Линкольн может занять два или более .

Как видим, есть 3 переменные:

  1. Общее количество ресурсов.
  2. Сколько ресурсов каждый раз, когда вы берете.
  3. Стратегия доступа (общая / эксклюзивная).

AQS - это шаблонный класс, используемый для управления КРИТИЧЕСКИМ РАЗДЕЛОМ, что означает, что вы можете просто расширить его и заполнить приведенными выше переменными, чтобы завершить свою работу. Детали, например, как избежать опасности гонки или управлять очередью, были скрыты.

Для дальнейшего чтения вам лучше изучить исходный код Mutex, Semaphore и ReentrantReadWriteLock.

...