作者|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的工具包来实现它,并且会有不同的经验。