Java 中线程之间如何进行通信?


Java线程通信全解析(2025技术演进视角)
时间戳:2025年3月2日 15:25(农历乙巳蛇年二月初三,星期日)


  1. 线程通信的本质与核心挑战
    通信目标:在多线程环境中安全高效地传递数据或信号,常见场景包括生产者-消费者模型、任务协调、状态同步等。
    技术难点:
  • 竞态条件:非原子操作导致数据不一致
  • 死锁风险:不当的锁获取顺序引发线程永久阻塞
  • 性能损耗:过度同步导致吞吐量下降

  1. 主流通信机制与最佳实践
    (1) 共享内存+锁机制
    实现原理:通过synchronizedReentrantLock保护共享变量
    典型场景:
// 库存扣减示例  
public class Inventory {  private int stock = 100;  private final Lock lock = new ReentrantLock();  public void deduct(int num) {  lock.lock();  try {  if (stock >= num) stock -= num;  } finally {  lock.unlock();  }  }  
}  

2025优化方向:

  • 虚拟线程下优先使用StampedLock(乐观读锁提升吞吐量)
  • 阿里内部采用「锁分段」策略(如将库存拆分为100个桶)

(2) 等待/通知机制(wait/notify)
经典模型:

// 生产者-消费者模型  
public class Buffer {  private Queue<Integer> queue = new LinkedList<>();  private final Object lock = new Object();  public void produce(int data) throws InterruptedException {  synchronized(lock) {  while (queue.size() >= 10) lock.wait();  queue.add(data);  lock.notifyAll();  }  }  public int consume() throws InterruptedException {  synchronized(lock) {  while (queue.isEmpty()) lock.wait();  int data = queue.poll();  lock.notifyAll();  return data;  }  }  
}  

避坑指南:

  • 必须使用while循环检查条件(防止虚假唤醒)
  • 优先使用notifyAll()而非notify()(避免信号丢失)
  • 虚拟线程环境下改用Condition接口的await/signal

(3) 并发工具类(java.util.concurrent)

工具通信方式适用场景
BlockingQueue阻塞式队列生产者-消费者(支持容量限制)
CountDownLatch倒计时门闩主线程等待多个子任务完成
CyclicBarrier可重用栅栏多阶段并行计算同步
Exchanger线程间数据交换管道式数据传输
Phaser动态注册的屏障复杂阶段任务协调

2025技术突破:

  • 腾讯TEG团队实现BlockingQueue百万级QPS(基于虚拟线程+零拷贝优化)
  • Disruptor框架在证券交易系统中达到纳秒级延迟

(4) 异步消息传递
实现方案:

  • CompletableFuture链式调用:
    CompletableFuture.supplyAsync(() -> fetchData())  .thenApply(data -> process(data))  .thenAccept(result -> saveToDB(result));  
    
  • EventBus事件总线(Google Guava):
    public class OrderEvent { /* 订单事件数据 */ }  @Subscribe  
    public void handleOrder(OrderEvent event) {  // 处理订单逻辑  
    }  
    

行业趋势:

  • Spring 6.x集成Reactor框架(响应式编程成为微服务通信标准)
  • 蚂蚁金服自研「星云」消息中间件(支持千万级Topic)

(5) 管道通信(PipedStream)
特殊场景:

// 线程间直接传输字节流  
PipedInputStream in = new PipedInputStream();  
PipedOutputStream out = new PipedOutputStream(in);  new Thread(() -> out.write("Hello".getBytes())).start();  
new Thread(() -> System.out.println(in.read())).start();  

适用边界:

  • 适用于简单数据流传输(已逐渐被BlockingQueue取代)
  • 虚拟线程下性能提升显著(I/O操作自动挂起不阻塞载体线程)

  1. 虚拟线程(Loom)带来的变革
    (1) 通信模式升级:
  • 传统线程:Thread.sleep()导致物理线程阻塞
  • 虚拟线程:挂起时立即释放载体线程,通过Continuation保存状态
// 虚拟线程间通信示例  
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {  Future<String> future1 = scope.fork(() -> callAPI1());  Future<String> future2 = scope.fork(() -> callAPI2());  scope.join();  String result = future1.resultNow() + future2.resultNow();  
}  

(2) 性能对比数据:

场景传统线程池(QPS)虚拟线程(QPS)
HTTP API调用12,00085,000
数据库批量写入8,50032,000

  1. 通信机制选择决策树
是否需要数据传递?  
├── 是 → 选择共享变量/队列  
│   ├── 低延迟 → Disruptor无锁队列  
│   └── 易用性 → BlockingQueue  
├── 否(仅信号协调)  
│   ├── 一次性 → CountDownLatch  
│   └── 多阶段 → Phaser/CyclicBarrier  
└── 跨服务通信 → 消息中间件(RocketMQ/Kafka)  

总结:2025年技术风向标

  1. 虚拟线程普及:优先使用StructuredTaskScope代替手动线程管理
  2. 无锁化趋势:VarHandleAtomicReference替代重量级锁
  3. 云原生集成:Kubernetes HPA根据线程通信压力自动扩缩容
  4. AI辅助优化:阿里云「线程通」工具自动推荐最佳通信模式
// 2025年推荐写法:虚拟线程+响应式编程  
CompletableFuture.runAsync(() -> {  if (Thread.currentThread().isVirtual()) {  System.out.println("运行在轻量级虚拟线程");  }  
}, Executors.newVirtualThreadPerTaskExecutor());  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27303.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个基于C# Winform开源免费的通用快速开发框架,内置完整的权限架构!

前言 今天大姚给大家分享一个基于C# Winform开源免费&#xff08;GPL-2.0开源协议&#xff09;的通用快速开发框架&#xff0c;内置完整的权限架构&#xff1a;WinformDevFramework。 项目介绍 WinformDevFramework是一个基于C# Winform开源免费&#xff08;GPL-2.0开源协议…

通俗解释机器学习中的召回率、精确率、准确率

先说个题外话&#xff0c;暴击一下乱写博客的人&#xff0c;网络上很多地方分不清准确率和精确率&#xff0c;在这里先正确区分一下精确率和准确率&#xff0c;以及他们的别称。 切入正题 很多人分不清召回率和精确率的区别&#xff0c;即使记住了公式&#xff0c;过段时间还是…

【数据结构】二叉树(门槛极低的系统性理解)

本篇文章将进行图文讲述该种数据结构&#xff01;看完一定不会让你失望&#xff0c;好的文章不需要过多的浮夸&#xff0c;质量就是深得人心的砝码&#xff01;下面我总结了最形象的趣味理解方法&#xff0c;一遍看完终身不忘&#xff01;制作不易&#xff0c;能否一键三连呢&a…

【漫话机器学习系列】114.逻辑 Sigmoid 函数

逻辑 Sigmoid 函数详解 1. 引言 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中常用的分类算法&#xff0c;而 Sigmoid 函数 是逻辑回归的核心数学工具。Sigmoid 函数能够将任意实数映射到 (0,1) 之间&#xff0c;因此特别适用于概率估计。在这篇文章中&a…

SpringBoot项目启动报错:PathVariable annotation was empty on param 0.

报错信息 SpringBoot项目启动报错&#xff1a;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.obstetric.archive.feignclient.DictServiceClient: FactoryBean threw exception on object creation; nested excepti…

Java 设计模式:软件开发的精髓与艺

目录 一、设计模式的起源二、设计模式的分类1. 创建型模式2. 结构型模式3. 行为型模式三、设计模式的实践1. 单例模式2. 工厂模式3. 策略模式四、设计模式的优势五、设计模式的局限性六、总结在软件开发的浩瀚星空中,设计模式犹如一颗颗璀璨的星辰,照亮了开发者前行的道路。它…

Unity小功能实现:鼠标点击移动物体

1、功能描述 当玩家点击鼠标时&#xff0c;场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。 2、实现步骤 创建Unity项目&#xff1a;首先&#xff0c;打开Unity并创建一个新的3D项目。 添加3D物体&#xff1a;在场景中创建一个3D物体&am…

避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新&#xff0c;例如php 7.3.7升级到了7.3.8&#xff0c;另外之前的版本有同学踩了坑&#xff0c;主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面会提到&#xff0c;请各位同学留意。 因为最近换电脑…

Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议

目录 一、常用Web服务器 1、Tomcat 2、Jetty 3、Undertow 二、什么是HTTP/2协议 1、定义 2、特性 3、优点 4、与HTTP/1.1的区别 三、集成Web服务器并开启HTTP/2协议 1、生成证书 2、新建springboot项目 3、集成Web服务器 3.1 集成Tomcat 3.2 集成Jetty 3.3 集成…

京东web 详情 cfe滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 data response.json() pri…

电池管理系统(BMS)架构详细解析:原理与器件选型指南

BMS&#xff08;电池管理系统&#xff09;架构详细讲解 从你提供的BMS&#xff08;Battery Management System&#xff09;架构图来看&#xff0c;主要涉及到电池监控模块、通信模块、功率控制模块等部分。下面我将详细讲解该架构的各个功能模块及其工作原理。 1. 电池管理核…

Linux常见基本指令(二)

目录 1、Linux基础指令 文本查看 cat指令 more指令 less指令 head指令&tail指令 时间相关指令 查找、搜索相关指令 find指令 which指令 whereis指令 alias指令 grep指令 打包压缩和解压缩 zip指令&#xff08;压缩&#xff09; unzip&#xff08;解压&…

HarmonyOS学习第12天:解锁表格布局的奥秘

表格布局初相识 不知不觉&#xff0c;我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里&#xff0c;我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能&#xff0c;比如组件的基本使用、布局的初步搭建等&#xff0c;这些知识就像一块块基石&#xff0c;为我…

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示&#xff1a;dp[i]&#xff0c;表示dp表中i下标位置的值 2. 状态转移方程&#xff1a;以i位置位置的状态&#xff0c;最近的一步来划分问题&#xff0c;比如可以将状态拆分成前状态来表示现状态&#xff0c;dp[i] …

大语言模型微调的基本概念介绍

大型语言模型&#xff08;LLMs&#xff09;正在以惊人的速度发展&#xff0c;LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤&#xff0c;今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek&#xff0c;实现了AI编程&#xff0c;体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

Spring MVC 程序开发(1)

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么&#xff1f;有什么关系&#xff1f; Servlet 是 java 官方定义的 web 开发的标准规范&#xff1b;Tomcat 是…

Notepad++下载地址【亲测好用】

网上下载链接五花八门&#xff0c;最终找到了一个官方下载链接。 本文章就用来记录Notepad下载网址 https://github.com/notepad-plus-plus/notepad-plus-plus/tags

LeetCode 873. Length of Longest Fibonacci Subsequence(2025/2/27每日一题)

昨天工作耽搁了&#xff0c;没来得及打卡每日一题&#xff0c;今日补上&#xff1a; 标题&#xff1a;Length of Longest Fibonacci Subsequence 题目&#xff1a; 例子&#xff1a; Example 1: Input: arr [1,2,3,4,5,6,7,8] Output: 5 Explanation: The longest subsequ…

【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt

在移动应用开发中&#xff0c;数据存储是一个至关重要的环节。对于使用UniApp开发的Android应用来说&#xff0c;缓存&#xff08;Cache&#xff09;是一种常见的数据存储方式&#xff0c;它能够提高应用的性能和用户体验。然而&#xff0c;缓存数据在用户清除缓存或清除应用数…