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

并发编程的基础:如何使用数组来实现阻塞队列?

时间:2023-03-08 21:02:05 网络应用技术

  顾名思义,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过程相同