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

与边界阻塞队列实施的并发编程实践的公平性

时间:2023-03-06 17:24:49 网络应用技术

  作者|Li Xinran来源|阿里技术公共帐户

  JUC工具包是Java并发编程的武器。

  本文讲述了如何在JUC工具包的帮助下在JUC工具包的帮助下实现公平而有限的阻塞队列。

  希望您还可以在文本后体验并发编程的复杂性,以及JUC工具包的强度。

  本文使用的基本工具:

  基于上述基本工具,可以实现公平且有限的阻塞队列。这里:

  1个基本版本

  首先,请考虑非字母场景中ADT的基本版本,使用ADT实现基本版本

  多于

  应该指出的是:离开团队时,本文是通过迁移头节点来避免修改尾部节点来实现的。在下面实现并发版本时,您将在此处看到意图。

  2个并发版本

  如果在同时情况下,上述实现面临一些问题,并且没有实现一些给定的需求。

  通过添加同步以确保并发条件下线程的安全性问题。

  请注意,同步的原因是要确保类的不变性。

  并发问题

  在并发场景中,真实版本的真实版本的问题包括:原子能,可见性和说明。

  请参阅JMM的描述。

  最简单的解决方案是:通过同步锁,一次解决问题。

  以上简单而粗鲁的添加同步可以解决该问题,但它将引入新问题:系统活动问题(此问题将在下面解决)。

  同时,只需将同步同步添加到障碍物等待中;那是,

  要实现阻止等待,您需要在Java中使用原始PV:等待,Notify,Notifyall。

  参考:等待的相关说明,通知,通知。

  监护人方法

  等待等待,您可以通过简单的卫生方法实现它。这个问题可以从本质上抽象:

  此摘要ADA在Java中在语言级别实现

  需要注意:

  基于此,不难获得边界队列的简单阻止版本,如下

  以上,阻塞等待,但也引入了更大的性能问题

  笔记:

  3锁定优化

  可以通过锁定分裂来解决第一个问题,即定义两个锁,读取锁并写锁;读写分离。

  多于

  上述实现

  但是仍然有上面尚未解决的问题:

  当有多个球队等待球队时,球队的运动将触发所有球队的比赛。在上下文上切换了大量线程,只有一个线程可以执行。

  也就是说,阅读和阅读和写作之间存在竞争。

  4状态跟踪谎言竞赛

  在这里,您可以关注状态跟踪,减轻阅读,阅读和写作和写作之间的竞争

  多于

  但是,在某些情况下,上述实现将失败,它将面临活动问题。考虑

  情况1:

  情况2:

  以上是失去阻塞消息的一个例子。问题的根本原因是处理异常治疗。

  5解决异常问题

  解决线程中断出口的问题,线程验证中断状态的场景

  多于

  通过状态变量跟踪,它可以解决阅读,阅读,写作和写作之间的锁定竞争问题。

  以下考虑来解决阅读,阅读,写作和写作之间的公平性。

  6解决公平

  公平问题的解决方案需要状态变量的痕迹:请求监视器跟踪。

  以上逻辑可以统一抽象为

  需要注意

  基于上述逻辑抽象,达到了公平队列

  多于

  释放信号后,队列在读写锁的帮助下同步更新;最后,阅读和写作锁还用于触发队列以更新消息。

  7个等待时间问题

  在合并场景中,等待有限的时间等待Time_waiting避免僵局或损失系统活动;

  意识到同步队列的时间限制的时间并不难。

  因为所有等待都被WaitNode监视器阻止

  最后,将WaitNode时间的逻辑加班,并将其带入FairnessboundendedBlockingqueququequeququequeququequequequequeque。

  本文是迭代的一步,最终使用Java同步原语,以实现初始版本的公平结合队列。在迭代实现过程中可以看到以下几点:

  最后,我相信每个人都会看着JUC的工具包来实现它,并且会有不同的经验。