顾名思义,ArrayBlockingQueue基于基于数组的阻塞队列。阻止队列可用于缓冲任务并实现生产者消费者模型,例如线程池中的工作队列。那么我们如何使用数组来实现阻止队列?
让我们从ArrayBlockingQueue的功能开始
让我们首先拆卸问题,然后划分这个问题
如何使用阵列实施数据进入团队,许多学生会想到第一次通过索引字段存储下一个写作职位。因此,如何与团队打交道,许多学生认为团队会返回数组的第一个元素,然后向前移动所有后续元素。
该解决方案的问题在于,当它们外出时,它将移动很多元素。它的时间复杂性是o(n)。是否有更有效的解决方案?还有另一个循环阵列解决方案。通过两个int字段,我们记录下一个输入团队和下一个元素的元素。最后,它也从0开始。
另外,当队列为空并且队列已满时,TakeIndex和putIndex都指向相同的位置,因此为了区分,我们可以使用计数字段来存储队列元素的数量。容量,这意味着队列已满
以下代码显示了带有数组的队列的特定实现。
“当队列已满时,加入团队的请求将阻止团队的请求。当队列具有剩余空间时,团队请求的发布实际上是一个特殊情况。满足条件。
在Java中,条件可用于同步+对象。等待和锁+条件。
通过锁定和状况方案,也可以保证线程安全性,因为在上面的圆形阵列中,线程之间共享的变量包括项目数组,TakeIndex,putIndex和count。可以通过read -write保护锁定类锁定共享变量的操作。
定义阻塞性锁定物体和条件,分为两个条件:不满而不是空。
以团队的入学行动为例,可以进入团队的条件是队列不满意,即count <tems.length。不能依次加入的条件是count == items.length。当我们满足条件时,我们可以输入团队。进入团队后,我们需要唤醒等待团队的线程。
PUT方法的过程是
该方法中有一些小细节
这是因为如果未使用局部变量,则将在字节代码指令级别调用呼叫变量的所有后续使用以呼叫aload 0以获取此功能,然后调用getfield指令以获取字段值,然后执行执行其他操作。首先将锁定到局部变量中,所有以后的锁定都可以变成ALOAD XXX指令,从而保存指令的数量并将加快方法的执行速度。
如果您不将其放在锁中,则可能同时出现多个线程以满足条件,然后锁定团队。尽管团队仍在关键区域,但队列将满足,并且仍在执行团队。此问题类似于单个检查中的一个检查锁定锁定的问题。
采用方法是对相应的团队方法,该方法基本上与PUT过程相同