自己动手实现一个阻塞队列

Java41

1. 阻塞队列介绍

顾名思义,阻塞队列是一个具备先进先出特性的队列结构,从队列末尾插入数据,从队列头部取出数据。而阻塞队列与普通队列的最大不同在于阻塞队列提供了阻塞式的同步插入、取出数据的功能(阻塞入队put/阻塞出队take)。

使用 put插入数据时,如果队列空间已满并不直接返回,而是令当前操作的线程陷入阻塞态(生产者线程),等待着阻塞队列中的元素被其它线程(消费者线程)取走,令队列重新变得不满时被唤醒再次尝试插入数据。使用 take取出数据时,如果队列空间为空并不直接返回,而是令当前操作的线程陷入阻塞态(消费者线程),等待其它线程(生产者线程)插入新元素,令队列非空时被唤醒再次尝试取出数据。

阻塞队列主要用于解决并发场景下消费者线程与生产者线程处理速度不一致的问题。例如jdk的线程池实现中,线程池核心线程(消费者线程)处理速度一定的情况下,如果业务方线程提交的任务过多导致核心线程处理不过来时,将任务暂时放进阻塞队列等待核心线程消费(阻塞队列未满);由于核心线程常驻的原因,当业务方线程提交的任务较少,核心线程消费速度高于业务方生产速度时,核心线程作为消费者会阻塞在阻塞队列的take方法中,避免无谓的浪费cpu资源。

由于阻塞队列在内部实现了协调生产者/消费者的机制而不需要外部使用者过多的考虑并发同步问题,极大的降低了生产者/消费者场景下程序的复杂度。

2. 自己实现阻塞队列

接下来,我们从低效率到高效率逐步实现几种不同版本的阻塞队列,以加深我们对阻塞队列工作原理的理解。

[En]

Next, we implement several different versions of blocking queues from low to high efficiency step by step to deepen our understanding of the working principle of blocking queues.

阻塞队列接口

为了降低复杂性,我们的阻塞队列只提供了最基本的出队、排队和空接口。

[En]

In order to reduce complexity, our blocking queue only provides the most basic dequeuing, queuing and null interfaces.

```
/**

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

内部类(Java)

基本介绍 概念:在一个类的内部再定义一个完整类 特点:编译后可以生成独立的字节码文件;内部类可以直接访问外部类的私有属性,而不破坏封装[En]Features: Independent bytecod...
Java

Java(8)数组

数组 数组存储相同类型值的序列。 声明数组 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标(index,或称索引)可以访问数组中的每一个值。例如,如果a是一个整型数组, a[i]就是数...
Java

都是中文用户名惹的祸~

进入公司遇到的第一个棘手BUG; 在数据库连接和配置正确的前提下,服务无法启动,控制台上报如下错误:[En]Under the premise that the database connection...
Java

设计模式之责任链模式

本文通过图书馆管理系统中,用户名校验、密码校验、需要增加问题,每次都要增加if判断语句,将其改用责任链模式进行链式调用,为了让代码更加的优雅,我们使用之前学过的建造者模式就代码进行改造。接着我们会介绍...
Java

ch05 Java方法

Java方法 何谓方法? System.out.println(); //类.对象.方法 Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 ...
Java

java集合框架

转载:https://www.cnblogs.com/yangliguo/p/7476788.html 部分修改自其它博主,地址找不到了,望见谅! 集合 集合与数组 数组(可以存储基本数据类型)是用来...
Java

JavaSE-分页工具方法

借用mybatisPlus的分页对象,可以自己创建一个 此方法针对集合设置分页,与SQL无关。 ``` /* * * @param pageNo 第几页 * ...
Java

设计模式之解释器模式

解释器模式字面意思,也即解释某些内容的含义。这种设计模式是实际开发中最不容易用到的。比如SQL解析,符号处理引擎,会用到解释器模式,属于更底层的开发人员才会用到的设计模式。 本文通过解释器模式的概念、...
Java

Java(4)字符串

从概念上讲,Java字符串就是 Unicode字符序列。例如,字符串 "Java\u2122"由5个 Unicode字符 J、 a、 v、 a和 ™组成。Java没有内置的字符串...
Java

TCP网络协议

TCP 面向连接:三次握手,四次挥手 可靠:超时重发解决丢包,包序号解决乱序、重复包 实现:滑动窗口、拥塞控制 TCP/IP四层协议 应用层:telnet,ftp,自实现网络应用程序 netstat ...