本文主要基于基于实施和相关分析的分析。
因此,建议首先了解AQS的实现原则,并且更容易理解重新输入的原理,请单击AQS详细信息。
这意味着当线程已经固定此锁定时,但是在某个时间,此线程必须尝试获取此锁定,这支持了此RE -NEABLED实现。
就重新输入而言,它可以重复,并指示重复时间的数量。当您想再次获得此锁定时;
当您要释放此锁定时,可以根据状态是否等于0来确定锁定是否由线程锁定。
首先创建一个重新输入对象,然后创建lock.lock(),最后是lock.unlock(),也就是说:
它相对较简单。推荐的方法是释放块中的锁定,因为它可以在异常时及时释放锁定资源。
可以实现关键字同步并wait()和notify() / notifyall()方法。重新输入也可以用于实现等待 /通知模式。
在了解重新进入实施AQ之前,让我们看看AQS实施类是如何运作的...
通常,通过AQS实现以下三个步骤:以下三个步骤:
应该注意的是,在重新进入中,国家的含义意味着
Reentrantlock是一种对应的TryAcquire和TryRelease方法。
有两个名词可以区分
等待和觉醒:
此外,大多数Reentrantlock的实施都是由AQS完成的。在上一篇博客文章中,对AQS进行了详细分析,因此这里有太多的重复分析...
特定的实现逻辑已在源代码中注释。简而言之,子类(此处同步)需要实现AQ提供的抽象方法来满足自己的个人需求。
最大的区别是,非锁定锁将尽可能多地进行(尽管等待队列中有许多等待节点)。
公平的锁,如果队列中有一个等待节点,它将不会抓住资源,将其放入队列中,然后按顺序获得资源。
在特定条件下等待资源
看一个示例:
在上面的示例中,您要实现的效果是使用多种条件来实现某些线程,也就是说,它将变得较小。
例如,我现在有10个线程,定义5个条件对象,并且在每个条件上注册了两个线程。假设在某些情况下,这10个线程被等待阻止。此时,Wake可以处理其业务(可用资源)。目前,我只能在条件上唤醒两个线,而其他线程仍在阻塞。这个做完了。
看看条件的实施原则:
创建条件对象,条件对象在这里是aqs的内部类
AbstractQuequueDysynchronizer#条件Object.await()
也就是说,在我们的示例中,通过procenta.await()输入状态,等待其他线程调用信号或信号
主要操作
4.2.1 AddConditionWaiter AbstractQuequeuedsynchronizer.ConditionOct#AddConditionWaiter
在条件下将当前线程打包成节点
4.2。
从条件等待队列中取消的节点
4.2.3全力发行资源摘要QualteSqueudysynchronizer#FirloRelease
4.2.4 Isonsyncqueue Ampactquequeuedsynchronizer#isonsyncqueue
确定当前节点是否在同步器队列中,如果是,则表示当前节点正在等待资源
AbstractQueudeSynchronizer.ConditionObject#信号
4.3.1 dosignal AbstractQueedSynchronizer.conditionoblt#dosignal
信号和信号是相似的,但是一个是唤醒所有等待当前条件的节点,而另一个则仅唤醒一个。这里没有重复。
相关文件:
原始:https://juejin.cn/post/7100485385595125773