Что такое 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
Просто удобный метод, который будет приостанавливать (парковать) поток, возвращаться при сбросе прерванного статуса.