当前位置: 首页 > 网络应用技术

- 深度分析和应用中的Java信号源代码

时间:2023-03-08 01:57:15 网络应用技术

  信号量信号量的原理和应用,以及与CountDownLatch的比较!

  公共类信号量扩展对象实现可序列化

  信号量来自JDK1.5的JUC软件包。字面翻译是信号量,它用作多线程并发控制工具。

  信号量可以控制同时访问共享资源的线程数。该线程通过帐户方法获得信号量,并通过一个信号量减少信号量。它控制了信号量的总数和每个线程所需的信号量的数量,然后控制多个线程的并发以访问共享资源为了确保合理地使用共享资源。C.com与同步和独家锁相比,它只能允许一个线程一次访问共享资源。该功能更强大,与共享锁有点相似!

  根据UML类图,可以清楚地看出,信号量和倒计时是由AQ直接实现的。区别在于,信号量还在公平模式下实现了两个内部类:Fairsync和非fair模式非fairsync。

  实际上,只有在获得信号量时才会反映公平性和非亲密感。他们的信号量的发布相同,类似于重新进入:fairthe锁定方法是相同的!也许这里有人在想,可以将信号视为锁定资源吗?可以在某个时候查看它。例如,您可以访问共享资源,您只能访问共享资源,只能获得“信号量”或“锁定”。将绑定到线程。

  在构造函数中,就像CountDownLatch构造函数传输的初始化计数的数量一样,将无数状态变量给出了aqs。信号信号的数量也给出了aqs的状态值。

  创建信号时,您可以使用公平变量来指定是否使用了公平策略,并且默认值为非fair模型。公平模式将确保获得等待信号数量的所有线程获得该研讨会的所有线程。高级第一,公平模式没有此保证。非fair模型的吞吐量高于公平模式的吞吐量,公平模式可以避免线程饥饿。

  公共无效accearire()

  获得可以中断的信号量,并且在其他线程提供信号音量并唤醒线程或线程中断之前,没有障碍物。获取信号量并立即返回,请通过1.减少可用信号的数量1.如果此方法中断或中断了。当调用此方法时,抛出了IntruptedException,并删除当前线的中断状态。

  公共空白获取(INT许可证)

  可以中断以获得信号范围。

  内部访问AQS的获得性脱颖而出的方法实际上是用于共享可中断资源的模板方法。因此,信号量和倒计时插图基于共享资源模型。

  当获得共享信号量资源时,信号量还实现了公平模式和非fair模型!他们的实现实际上与实现锁定锁时的锁定资源的公平性和非fair获取非常相似!

  公平模式调用Fairsync的TryAcquireshard方法!

  如果我们已经学习了AQS,Reentrantlock和ReadWritelock的源代码,则第一个会找到HasqueuedPredEcspors的方法。此方法是AQ实现公平模式的预定义方法。AQS帮助我们实现了它。任何线程都在等待当前线程获得信号传导资源。

  可能是:

  该原理仍然非常简单,也就是说,要确定当前信号量资源的数量 - 状态的价值,是否满足要获得的信号量资源的数量,默认情况下获得1个资源的AcceAire()方法。CAS的原子降低状态,否则意味着获得的资源失败了,它可能会阻止。重新检查。你为什么要尝试?

  实际上,我们在AQS文章中的“实现共享锁定”已经说过:因为可能有多个线程同时获得信号资源,但是因为CAS只能保证一次只有一个线程,其他线程,因此其他线程可以是其他线程,因此其他线程可以是其他线程,因此其他线程可以是其他线程,因此其他线程是其他线程的,因此其他线程可以是其他线程,因此可以是其他线程,因此因此,其他线程是其他线程的,因此其他线程是其他线程的,因此其他线程可能是其他线程。必须失败,但是目前,实际上尚未获得剩余的信号量资源,因此让其他线程再次测试。与直接添加到同步队列相比,信号资源的利用率更高!

  非fair模式调用tryacquireshaared nonfairsync的方法!

  与实现公平模型的实现相比,缺少hasqueedpredequementer的判断。可以想象:如果线程第一个调用aquire()方法获得信号量,但是如果当前信号量的数量为0,则该线程A将放置在AQS的同步队列中。

  一段时间后,螺纹B称为release()方法以释放信号量。它将唤醒线程在队列中等待的线程,但是螺纹C再次称为aquire()方法。如果采用了非平台策略,则线程C将与线程A竞争此信号资源。nonfiairtryacquireshaared的代码,线程C可以在激活线程A之前或激活后,即阻止线程和当前请求的线程是在此模式下的竞争关系,而不是竞争关系的关系,而不是竞争性关系,则可以获得信号数量,也不遵守第一个策略。

  此外,非fair模型的特定实现是父类同步中nonfairtryacquireshared的方法,为什么在父类中实现此方法,因为无论是指定的公平模式还是非fair模式,TryAcquire方法是通过CallingNonFairtryAcquireshared方法来调用的,因此在父类中实现了它!

  公共void recapireunindrection()

  如果您不中断信号量,则没有障碍物,直到提供信号量并唤醒线程直到其他线程为止。获取信号量并立即返回,请将可用信号的数量减少1。

  与获取方法相比,此方法不响应中断,也不会抛出IntruptedException

  公共空白可获得无宁(INT许可)

  附加获得许可证信号量。

  与获取方法相比,获取性中断的方法不会对中断做出响应,也不会抛出InteruptEptexception。

  公共布尔tryAcquire(长时间,时效单元)

  获得可以在超时期间中断的信号量。

  如果此方法在调用此方法时被中断或中断,则抛出了IntruptedException,并删除当前线程的中断状态。

  公共布尔TRYACQUIRE(INT许可,长时间,时机单元)

  获取信号信号的超时。

  实际上,实际使用了调用AQ的TryAcquiresharedNanos方法,这实际上是用于中断资源以获取资源的共享超时的模板方法。

  公共布尔tryAcquire()

  打电话时至少至少有一个可用的信号量,您尝试获取信号量。

  公共布尔tryAcquire(INT许可证)

  至少只有在尝试获得许可证信号量之前调用呼叫时的允许信号量。

  实际上,实际上是直接调用了非fairertryacquireshared方法,也就是说,公平模式和非fair模式TryAcquire实现方式相同!返回假!

  公共空白释放()

  释放信号量,信号量的总数。1。发布成功后,它将唤醒节点(线程)等待同步队列中的信号量!

  公共空隙释放(INT许可)

  释放允许信号量,信号量加允许的总数。发布后,它将唤醒节点(线程)等待同步队列中的信号量!

  公平模式和非fair模式的发布是相同的。实际上,实际使用了AQS的发行方法,这实际上是共享资源的模板方法。

  信号量可用于控制对共享资源访问的多线程访问的复杂性!

  案例:如果一家工厂有5台机器,但是有8个工人,则只能同时使用一台机器。只有在使用后,其他工人才能继续使用。

  我们可以通过信号量通过先前的Countdownlatch轻松实现它。我们可以发现,当使用Semaphore的非平面模型最多时,工人的总工作量高于公平模型中工人的整体工作量,即,即非航行模型的实施效率更高(这不一定是)。我们还可以发现,当具有较高工作量的非FAIR模型工人的整体工作量时,高于公平模型的一般工作量时,在非模型中,将永远是一些工人(尤其是工人0、1、2)。一些工人的工作较少,这就是饥饿!

  信号量和倒计时的原理相似。他们使用AQS的共享模式来实现自己的逻辑。它们是由AQ的状态资源使用的,但是它们实现了不同的功能。倒计时中的状态被认为是倒计时。当状态变为0时,这意味着线程可以放开执行。信号量中的状态被视为信号量资源。如果未获得资源,则可能会被阻止。如果获得资源,则可以访问共享区域。切记在使用共享区域后返回信号量。

  显然,信号量的信号量资源类似于锁定资源,但我们说它们的差异是锁定资源绑定到获得锁定的线程,也就是说,您可以不断保持一些线程“释放信号量”,其他线程只是“获得信号量”。这实际上是aqs中状态状态值的变化,这与线程无关!

  通常,信号量可用于控制对共享资源访问的多线程访问的复杂性。在上述情况下,我们已经看到了它!此外,应注意的是,如果AQS同步队列中的头节点线程螺纹需要获得n个资源。目前,有一个资源。如果m小于n,则该队列中的HEAD节点线程以及后来的所有节点,所有节点稍后将继续阻止该线程,因为它们无法获得资源,也就是说,已经阻止了AQS中的线程同步队列只能以先进的顺序获得资源。如果由于所需的资源数量不足,总线程始终被阻塞,则队列背后的线程不得获得资源!

  像Countdownlatch一样,信号量的源代码看起来很简单。这是因为复杂的线程等待和唤醒机制已由AQ实现。如果您想真正理解信号的原理,则必须理解AQ。实际上,如果您学习了AQ,那么JUC中的锁或其他同步组件很简单!

  相关文章:

  如果您需要交流或文章错误,请直接留言。此外,我想喜欢,收集和关注,我将继续更新各种Java学习博客!

  原始:https://juejin.cn/post/7103504476375351326