AbstractQueuedSynchronizer在Java的concurrent.locks包中是用来做什么的?有人能说明一下它的方法doAcquireInterruptibly和parkAndCheckInterrupt吗?
发布于 2012-03-10 08:49:19
AbstractQueuedSynchronizer在concurrent.locks包中的用途是什么
AbstractQueuedSynchronizer是在java.util.concurrency包中使用和实现(至少)的同步构造的构建块。
例如,ReentrantLock将委托给扩展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,同时处理任何特殊的功能本身(例如,这个锁要求拥有锁的线程是释放锁的线程,而信号量不需要)。
可以让人对它的方法doAcquireInterruptibly和parkAndCheckInterrupt有所了解
注意:这些方法对类是私有的,因此实际的功能可以在不同版本或不同实现之间进行更改。我现在解释的默认功能如下:
doAcquireInterruptibly将尝试成为此同步的独占所有者。它将永远这样做,直到线程被中断或成功获取为止。考虑一个试图进入synchronized块的线程,线程将永远呆在那里,直到它进入监视器(当前没有线程拥有或拥有的线程存在监视器)。这里的优点是获取线程可以被中断。
parkAndCheckInterrupt只是一个方便的方法,它将挂起(停放)一个线程,在重置中断状态的同时返回。
发布于 2012-10-24 04:59:13
发布于 2013-12-11 08:23:39
我想用一些简单的话谈谈AbstractQueuedSynchronizer(AQS)。
想一想现实世界中的这些情景:
2或2
正如我们所看到的,有三个变量:
AQS是一个模板类,用于管理关键部分,这意味着您可以对其进行扩展,并使用上面的变量来完成您的工作。如何避免竞争风险或控制队列等详细信息已被隐藏。
要进一步阅读,您最好了解Mutex、Semaphore和ReentrantReadWriteLock的源代码。
https://stackoverflow.com/questions/9644856
复制相似问题