SynchronousQueue简介

news/2025/2/12 4:04:19/

目录

      • 一、介绍:
      • 二、使用场景:
      • 三、死锁的场景

SynchronousQueue 是 Java 中的一个特殊的阻塞队列,它的主要特点是它的容量为0。这意味着 SynchronousQueue不会存储任何元素,它主要用于线程之间的直接传递,即生产者线程将元素直接交给消费者线程,而不需要缓冲区。

以下是关于 SynchronousQueue 的介绍以及一些使用场景:

一、介绍:

  • SynchronousQueue 是一个具有零容量的队列,它不保存任何元素,它的主要作用是在线程之间传递数据。
  • 当生产者线程尝试将数据放入 SynchronousQueue 时,它会阻塞,直到有一个消费者线程来获取这个数据。
  • 同样地,当消费者线程尝试从 SynchronousQueue 获取数据时,它也会阻塞,直到有一个生产者线程将数据放入队列。
  • SynchronousQueue 可以用于线程之间的一对一数据传递,或者多个生产者和多个消费者之间的数据传递。

二、使用场景:

  1. 线程间传递任务SynchronousQueue 可以用于实现一种线程池模式,其中生产者线程将任务提交到队列,而消费者线程从队列中获取任务并执行。这对于需要严格控制并发度的场景非常有用。

  2. 多个生产者和多个消费者SynchronousQueue 也可以用于多个生产者和多个消费者之间的数据传递。每个生产者可以将数据直接传递给一个消费者,而不需要额外的缓冲区。

下面是一个简单的示例,演示了 SynchronousQueue 的用法:

import java.util.concurrent.SynchronousQueue;public class SynchronousQueueExample {public static void main(String[] args) {SynchronousQueue<Integer> queue = new SynchronousQueue<>();// 生产者线程new Thread(() -> {try {int data = 42;System.out.println("生产者线程将数据放入队列: " + data);queue.put(data);} catch (InterruptedException e) {e.printStackTrace();}}).start();// 消费者线程new Thread(() -> {try {int data = queue.take();System.out.println("消费者线程从队列中获取数据: " + data);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}

需要注意的是,SynchronousQueue 的使用需要谨慎,因为它非常容易导致死锁,如果没有恰当地设计和同步生产者和消费者线程,可能会造成程序无法继续执行。因此,在使用 SynchronousQueue 时要注意线程同步和错误处理。

三、死锁的场景

以下是一个 SynchronousQueue 可能导致死锁的示例情况:

public class SynchronousQueueDeadlockDemo {public static void main(String[] args) {final SynchronousQueue<Integer> queue = new SynchronousQueue<>();Thread thread1 = new Thread(() -> {try {// 线程1尝试将数据放入队列int data = 42;queue.put(data);System.out.println("线程1放入数据:" + data);// 接着,线程1尝试从队列中获取数据,但此时没有其他线程来获取int result = queue.take();System.out.println("线程1获取数据:" + result);} catch (InterruptedException e) {e.printStackTrace();}});Thread thread2 = new Thread(() -> {try {// 接着,线程2尝试将数据放入队列,但此时没有其他线程来获取int result = 100;queue.put(result);System.out.println("线程2放入数据:" + result);// 线程2尝试从队列中获取数据,但此时没有数据可用int data = queue.take();System.out.println("线程2获取数据:" + data);} catch (InterruptedException e) {e.printStackTrace();}});thread1.start();thread2.start();}
}

http://www.ppmy.cn/news/1137961.html

相关文章

Java Spring Boot 写 API 接口

在当今快速的软件开发世界中&#xff0c;构建 API 接口是非常常见的任务。因为许多应用程序需要通过 API 接口来与其他应用程序通信。API 接口不仅可以提供应用程序的数据&#xff0c;还可以将应用程序的功能公开为可重用的服务。Java Spring Boot 是一个用于创建独立、产品级别…

PHP 行事准则:PHP 配置文件

文章目录 参考环境PHP 行事准则PHP 配置文件php.ini-production 与 php.ini-development生产配置文件开发配置文件配置文件的应用版本差异 修改配置的生效 PHP 运行时配置ini_set()布尔配置项限制 phpinfo()phpinfo 页面Core 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一…

H5移动端购物商城系统源码 小型商城全新简洁风格全新UI 支持易支付接口

一款比较简单的 H5 移动端购物商城系统源码&#xff0c;比较适合单品商城、小型商城使用。带有易支付接口。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391704 源码下载2&#xff1a;评论留言或私信留言

三相逆变器下垂控制双机

下垂控制的原理推荐看这篇知乎&#xff08;形象又生动&#xff09;&#xff1a;https://www.zhihu.com/question/41003509/answer/518837491 主拓扑图 控制主要模块 Droop子模块 监控有功结果 1、从两台逆变器输出的有功功率波形可以看到&#xff0c;在负载突变的时候&#xf…

Python柱形图

柱形图 柱形图&#xff0c;又称长条图、柱状统计图、条图、条状图、棒形图&#xff0c;是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值&#xff08;不同时间或者不同条件&#xff09;&#xff0c;只有一个变量&#xff0c;通常利用于较小的数据集分析…

基于引力搜索优化的BP神经网络(分类应用) - 附代码

基于引力搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于引力搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.引力搜索优化BP神经网络3.1 BP神经网络参数设置3.2 引力搜索算法应用 4.测试结果…

Python入门教程50:Pycharm中鼠标滚动,如何实现字体大小自由的缩放

★★★★★博文创作不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习编程小技巧。使用代码的过程中&#xff0c;如有疑问的地方&#xff0c;欢迎大家指正留言交流。喜欢的老铁可以多多点赞收藏分享置顶&#xff0c;小红牛在此表示感谢…

面试题: Spring AOP是如何实现的? 它和AspectJ有什么区别?

Spring AOP是如何实现的? 它和AspectJ有什么区别? 背景答案SpringAOP实现与AspectJ区别AOP 的几种实现方案 个人评价 背景 想换工作, 学习一下面试题, 算是学习记录的输出. 答案 SpringAOP实现 Spring AOP 是利用的动态代理的机制, 如果一个Bean 实现了接口, 那么就会采用…