什么是Java qazxsw poi包中的qazxsw poi用于?有人可以对其方法AbstractQueuedSynchronizer
和concurrent.locks
有所了解吗?
什么是用于的concurrent.locks包中的AbstractQueuedSynchronizer
AbstractQueuedSynchronizer是在java.util.concurrency包中使用和实现(至少)的同步构造的构建块。
例如,ReentrantLock委托给扩展AbstractQueuedSynchronizer的Sync。如果你要编写自己的锁,它可能看起来像这样
doAcquireInterruptibly
所以这里的MyLock类将继承线程暂停和排队到AQS的低级功能,同时处理任何特殊功能本身(例如,这个锁需要拥有锁的线程是释放它的线程,但信号量不是)。
有人可以对其方法doAcquireInterruptibly和parkAndCheckInterrupt进行一些说明
注意:这些方法对于类是私有的,因此实际功能可以在不同版本或不同实现之间进行更改。我正在解释的默认提供的功能如下:
parkAndCheckInterrupt
将尝试成为此同步的独家所有者。它将永远执行此操作,直到线程被中断或成功获取。考虑一个线程试图进入一个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);
}
}
块,该线程将坐在那里等待它直到它进入监视器(当前没有线程拥有或监视器存在拥有线程)。这里的优点是可以中断获取线程。
doAcquireInterruptibly
只是一种方便方法,它将暂停(停放)一个线程,在重置中断状态时返回。
我想用一些简单的单词来讨论AbstractQueuedSynchronizer(AQS)。
想想现实世界中的这些场景:
如我们所见,有3个变量:
AQS是一个用于管理CRITICAL SECTION的模板类,这意味着您只需扩展它并填写上面的变量即可完成工作。隐藏了如何避免种族危险或控制队列等细节。
为了进一步阅读,您最好学习Mutex,Semaphore和ReentrantReadWriteLock的源代码。