【特殊的阻塞队列】 java.util.concurrent.SynchronousQueue 源码分析

Java47

描述

SynchrounousQueue 是一个比较特殊的无界阻塞队列并支持非公平和公平模式,严格意义上来说不算一个队列,因为它不像其他阻塞队列一样能有容量,它仅有一个指向栈顶的地址,栈中的节点由线程自己保存。任意的线程都会等待直到获得数据(消费)或者交付完成(生产)才会返回。
SynchronousQueue 和普通的阻塞队列的差异类似于下图所示(非公平模式):
阻塞队列通常是存储生产者的生产结果然后消费者去消费,阻塞队列就类似于一个中转站。
SynchronousQueue 则存储生产结果,只告诉消费者生产者的位置,然后让其自己去与之交流(反过来一样),就没有中转的一个过程而是直接交付的。
【特殊的阻塞队列】 java.util.concurrent.SynchronousQueue 源码分析

SynchronousQueue 将数据交付的任务交给生产者或消费者自行处理,实现的非常看不懂。

那么既然是 Queue ,就可以通过 offertake 方法来了解
offer:

public boolean offer(E e) {
    if (e == null) throw new NullPointerException();
    return transferer.transfer(e, true, 0) != null;
}

take:

输入验证码查看隐藏内容

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

相关文章
Java

RabitMQ 发布确认

每日一句 军人天生就舍弃了战斗的意义! 概述 RabitMQ 发布确认,保证消息在磁盘上。 前提条件 1。队列必须持久化 队列持久化 2。队列中的消息必须持久化 消息持久化 使用 三种发布确认的方式:...
Java

windows中打开redis-server闪退

windows中打开redis-server闪退 第一次运行redis-server的时候闪退 win+R运行cmd打开命令行 进入redis根目录 输入 redis-server.exe redis...
Java

M1 MAC 装ubuntu更换镜像源

记录一下今天突发奇想装个ubuntu遇到问题 w镜像源:更换镜像源网上教程基本对的,但要注意机型(ps:m1 mac) 补:很多时候是对问题理解不到位,比如我直接搜索arm ubuntu镜像源 认识有...
Java

线程安全策略

本文基于图灵课堂周瑜老师的讲解整理,包括spring bean加载的过程,主要是扫描BeanDefinition以及初始化非懒加载单例Bean两部分,源码取自SpringFramework 5.3.2...
Java

WebSocket

WebSocketConfig.java /** * WebSocket配置类 * @author admin */ @Configu...
Java

windows安装mysql8(5分钟)

1、下载 MySQL https://dev.mysql.com/downloads/mysql/ 下载完成后,解压缩到你的目录里。 2、配置 MySQL 的配置文件 创建一个文件,名称为: my.i...
Java

Linux常用命令

1、pwd命令 pwd命令,查看当前目录的路径 linux下所有的绝对路径都是从根目录"/"开始 root:是linux下root用户的根目录 home:是linux下其他用户的默认根目录 (例如:在...
Java

如何生成一个java文档

如何生成一个java文档 众所周知,一个程序给别人看可能可以看懂,几万行程序就不一定了。在更多的时候,我们并不需要让别人知道我们的程序是怎么写的,只需要告诉他们怎么用的。那么,api文档就发挥了它的作...
Java

ch03 Java基础

JAVA基础 JAVA基础 数据类型 类型转换 变量 类变量和实例变量的区别和联系 常量 变量命名规范 运算符 位运算 包机制 JavaDoc 数据类型 强类型语言 要求变量的使用要严格符合规定,所有...
Java

Java 线程创建与常用方法

进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO...