Java多线程通信核心机制详解

在Java中,多线程通信与协作主要通过以下几种核心机制实现,每种方式适用于不同的并发场景:


🔄 一、共享变量+同步控制(基础方式)

// 使用volatile保证可见性
private volatile boolean flag = false;// 线程A
new Thread(() -> {while(!flag); // 等待标志位变化System.out.println("检测到标志位变化");
}).start();// 线程B
new Thread(() -> {try { Thread.sleep(1000); } catch (InterruptedException e) {}flag = true; // 修改共享状态
}).start();

特点

  • volatile 保证变量修改的可见性
  • ❌ 需配合synchronized保证原子性
  • ⚠️ 忙等待(while循环)消耗CPU资源

🤝 二、wait()/notify()机制(经典协作)

Object lock = new Object();// 等待线程
new Thread(() -> {synchronized(lock) {try {lock.wait(); // 释放锁并等待System.out.println("被唤醒");} catch (InterruptedException e) {}}
}).start();// 唤醒线程
new Thread(() -> {synchronized(lock) {lock.notify(); // 唤醒等待线程}
}).start();

关键点

  • ✅ 精确控制线程阻塞/唤醒
  • ❌ 必须配合synchronized使用
  • ⚠️ notify()随机唤醒单个线程,notifyAll()唤醒所有

📨 三、BlockingQueue(生产者-消费者模式)

BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);// 生产者
new Thread(() -> {try {queue.put("数据"); // 阻塞式插入} catch (InterruptedException e) {}
}).start();// 消费者
new Thread(() -> {try {String data = queue.take(); // 阻塞式获取System.out.println("消费:" + data);} catch (InterruptedException e) {}
}).start();

优势

  • ✅ 内置线程安全与阻塞控制
  • ✅ 支持容量限制(防止内存溢出)
  • 📊 常用实现:ArrayBlockingQueueLinkedBlockingQueue

🔐 四、CountDownLatch/CyclicBarrier(同步屏障)

CountDownLatch latch = new CountDownLatch(3);// 工作线程
for (int i = 0; i < 3; i++) {new Thread(() -> {System.out.println("子线程完成");latch.countDown(); // 计数器减1}).start();
}latch.await(); // 主线程等待计数器归零
System.out.println("所有线程执行完毕");

对比

工具特点重用性
CountDownLatch一次性使用,等待N个任务完成❌ 不可重用
CyclicBarrier可重复使用,线程互相等待✅ 可重用

✉️ 五、Exchanger(线程间数据交换)

Exchanger<String> exchanger = new Exchanger<>();// 线程A
new Thread(() -> {try {String data = exchanger.exchange("数据A");System.out.println("收到:" + data);} catch (InterruptedException e) {}
}).start();// 线程B
new Thread(() -> {try {String data = exchanger.exchange("数据B");System.out.println("收到:" + data);} catch (InterruptedException e) {}
}).start();

适用场景

  • ✅ 两个线程间双向数据交换
  • ❌ 不支持多线程组交换

🧠 六、Phaser(灵活阶段同步)

Phaser phaser = new Phaser(3); // 注册3个线程for (int i = 0; i < 3; i++) {new Thread(() -> {System.out.println("阶段1完成");phaser.arriveAndAwaitAdvance(); // 等待所有线程System.out.println("阶段2完成");phaser.arriveAndDeregister(); // 退出注册}).start();
}

高级功能

  • ✅ 动态调整参与线程数
  • ✅ 支持多阶段同步控制

⚡ 最佳实践建议

  1. 优先选择高层工具
    使用BlockingQueueCountDownLatch等JDK并发工具,避免手动实现wait()/notify()
  2. 避免死锁
    按固定顺序获取多把锁,或使用tryLock()设置超时
  3. 虚拟线程优化(Java 21+)
    Thread.startVirtualThread(() -> { /* 任务代码 */ });
    
  4. 监控工具
    使用jstack或VisualVM分析线程阻塞状态

注意:跨线程通信时务必考虑可见性(volatile/happens-before原则)和原子性(锁/CAS),避免出现竞态条件。

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

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

相关文章

Django知识-视图

视图设置 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python 函数&#xff0c;它接受Web请求并且返回Web响应。代码写在哪里也无所谓&#xff0c;只要它在你的应用目录下面。但是为了方便视图一般被定义在“应用/views.py”文件中。 视图的第一个参数必须为Ht…

DevSecOps实践:CI/CD流水线集成动态安全测试(DAST)工具

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 让安全扫描成为代码交付的“守门员” 引言&#xff1a;安全漏洞的代价&#xff0c;越早发现越好 在软件开发领域&#xff0c;安全漏洞的修复成本随着开发…

使用CSDN作为Markdown编辑器图床

使用CSDN作为Markdown编辑器图床 一、CSDN图床的优势 MD编辑器在撰写文档时功能强大&#xff0c;但插入图片需借助图床。CSDN作为免费图床&#xff0c;操作简单且稳定性高&#xff0c;适合日常使用。只需将图片上传至CSDN的MD编辑器&#xff0c;即可获取可直接访问的图片地址…

python打卡day51

复习日 作业&#xff1a;day43的时候我们安排大家对自己找的数据集用简单cnn训练&#xff0c;现在可以尝试下借助这几天的知识来实现精度的进一步提高 还是继续用上次的街头食物分类数据集&#xff0c;既然已经统一图片尺寸到了140x140&#xff0c;所以这次选用轻量化模型 Mobi…

Vuex 自动化生成工具

Vuex 自动化生成工具需求文档 1. 需求背景 为提升前端开发效率&#xff0c;减少重复代码编写&#xff0c;需开发一个自动化工具&#xff0c;根据输入参数自动生成完整的 Vuex 存储模块&#xff08;包括api.js&#xff0c;mutations.js&#xff0c;actions.js&#xff0c;gette…

深入浅出多路归并:原理、实现与实战案例解析

文章目录 二路归并多路归并方法一&#xff1a;指针遍历&#xff08;多指针比较法&#xff09;方法二&#xff1a;小根堆法&#xff08;最小堆归并&#xff09; 实际场景外部排序 经典题目丑数Ⅱ方法一&#xff1a;三指针法方法二&#xff1a;优先队列法&#xff08;K路归并&…

Koji构建系统宏定义注入与Tag体系解析

在Red Hat生态的持续集成链条中&#xff0c;Koji作为核心构建系统&#xff0c;其灵活的宏定义机制与精密的Tag体系是保障软件包高效流转的关键。本文将系统阐述在既有构建目标中注入宏定义的技术路径&#xff0c;并深度解析Koji中Target与Tag的概念架构及其版本演进差异。 一、…

【Kubernetes】架构与原理:核心概念、组件协同及容器化部署解析

文章目录 一、前言二、为什么需要 Kubernetes1. 传统部署方法2. 虚拟化部署3. 容器化部署Ⅰ. 基本概念Ⅱ. 容器编排的必要性Ⅲ. 容器化部署的优势4. k8s 的历史与发展三、Kubernetes 基本概念1. k8s 核心架构解析Ⅰ. 控制平面与工作节点Ⅱ. 各组件协同工作原理2. k8s 核心概念Ⅰ…

Pip Manager本地Python包管理器

在Python开发领域&#xff0c;包管理是每个开发者日常工作中不可或缺的一部分。虽然命令行工具pip功能强大&#xff0c;但对于初学者和非技术背景的用户来说&#xff0c;命令行界面往往显得不够友好。如果使用PyCharm&#xff0c;则可以非常简单的管理安装的Python包&#xff1…

vscode界面设置透明度--插件Glasslt-VSC

【快捷键:透明度提高(CtrAlt Z)&#xff0c;透明度降低(CtrAlt C)】

OPENCV形态学基础之一膨胀

一.膨胀的原理 数学表达式&#xff1a;dst(x,y) dilate(src(x,y)) max(x,y)src(xx,yy) 膨胀是图像形态学的基本功能之一&#xff0c;膨胀顾名思义就是求图像的局部最大值操作&#xff0c;它的数学表达式是dst(x,y) dilate(src(x,y)) max(x,y)src(xx,yy)。 从数学的角度来看…

彻底禁用Windows Defender通知和图标

方法 一&#xff1a;通过注册表强制隐藏 Defender 图标&#xff08;永久生效&#xff09;​​ &#xff08;适用于彻底隐藏图标&#xff0c;但需谨慎操作&#xff09; ​​打开注册表编辑器​​ 按 Win R&#xff0c;输入 regedit 回车。 ​​导航到 Defender 相关注册表项​…

Kafka 2.7.0 单节点安装与启动教程(适配 JDK 1.8)

1. 下载与解压 官方下载 Kafka 2.7.0 https://archive.apache.org/dist/kafka/2.7.0/kafka_2.13-2.7.0.tgz 上传到虚拟机&#xff08;如 /home/wang/soft/kafka&#xff09;解压&#xff1a; tar -zxvf kafka_2.13-2.7.0.tgz 2. 配置环境变量&#xff08;可选&#xff0c;便…

23、Python字符串核心机制解析:驻留原理、对象比较与成员检测实战

适合人群&#xff1a;零基础自学者 | 编程小白快速入门 阅读时长&#xff1a;约5分钟 文章目录 一、问题&#xff1a;Python的字符串驻留机制&#xff1f;1、例子1&#xff1a;字符串驻留现象2、答案&#xff1a;&#xff08;1&#xff09;字符串驻留 二、问题&#xff1a;Pyth…

pikachu靶场通关笔记22-2 SQL注入05-2-update注入(报错法)

目录 一、SQL注入 二、update注入 三、报错型注入 四、源码分析 1、代码审计 2、渗透思路 五、渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff…

【prometheus+Grafana篇】基于Prometheus+Grafana实现Redis数据库的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

R语言速释制剂QBD解决方案之四

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》速释制剂混合和润滑工艺研究的R语言解决方案。 原料粒径分布与混合次数对混合均一性的影响 由于acetriptan 的溶解度低&#xff0c;acetriptan 需要粉碎以提高生物利用度。粉碎后的原料…

用python玩转大语言模型——从 RNN 到文本生成大语言模型的奇幻之旅

用python玩转大语言模型——从 RNN 到文本生成大语言模型的奇幻之旅 第一部分:RNN原理及其结构(魔法师的记忆水晶球) 1.1 经典RNN结构(时光旅行者的备忘录) 核心概念 时间循环:RNN通过隐藏状态h在时间步之间传递信息,形成闭环结构参数共享:每个时间步使用相同的权重…

数据结构(9)排序

一、常见排序算法 排序在生活中无处不在&#xff0c;上学这么多年班级排名啥的总有吧&#xff0c;不可能一次都没见过&#xff1b;打游戏有的排行榜不也是有排序的思想在里面&#xff0c;排序倒不是什么特殊的数据结构&#xff0c;但是是非常重要的算法思想&#xff0c;所以在初…

量子计算导论课程设计 之 PennyLane环境搭建

文章目录 具体配置conda 虚拟环境配置Pennylane 正所谓&#xff0c;磨刀不误砍柴工&#xff0c;想要进行量子计算导论的课程设计&#xff0c;首先就是搭建好平台&#xff0c;推荐大家就是本地搭建&#xff0c;那么下面有三种选择 QiskitTensorFlow QuantumPennylane 具体配置…