当前位置: 首页 > news >正文

[java 虚拟线程 ]

package com.hugh.java17.v19;import java.time.Duration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class VirtualThrd {private static final Logger logger = LoggerFactory.getLogger(VirtualThrd.class);public static void main(String[] args) {// ExcutorService实现了AutoCloseable接口,可以自动关闭try (// 没使用虚拟线程 压根走不到最后
//                ExecutorService executor = Executors.newCachedThreadPool()// 使用虚拟线程 可以ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 1000000).forEach(i -> {executor.submit(() -> {try {// 模拟Thread.sleep(Duration.ofSeconds(1));System.out.println("执行任务:" + i);} catch (InterruptedException e) {
//                                e.printStackTrace();logger.error("Error: {} - {}", e.getClass().getSimpleName(), e.getMessage());}});});} catch (Exception e) {throw new RuntimeException(e);}}
}

image


你提到的问题核心在于:虚拟线程对 synchronizedReentrantLock 的“阻塞处理机制不同”,这与它们的实现方式密切相关,并非“同一级别”的阻塞行为。

关键区别:阻塞是否会“卡住携带器(平台线程)”

虚拟线程的设计目标是:在阻塞时“释放平台线程”(解除挂载),让平台线程去运行其他虚拟线程,从而提高吞吐量。但这个机制只对“协作式阻塞”有效,对“非协作式阻塞”无效。

  1. synchronized 的问题:非协作式阻塞,会卡住携带器
    synchronizedJVM 内置的同步机制,其阻塞逻辑由 JVM 底层实现(依赖操作系统的管程/互斥锁)。当虚拟线程执行 synchronized 代码块并阻塞时(比如等待锁),JVM 无法“感知”到这种阻塞是来自虚拟线程,会直接将整个平台线程(携带器)挂起
    → 结果:平台线程被卡住,无法去运行其他虚拟线程,虚拟线程的“轻量”优势失效。

  2. ReentrantLock 的优势:协作式阻塞,释放携带器
    ReentrantLockJava 代码层面实现的锁(基于 AbstractQueuedSynchronizer 框架),其阻塞逻辑(如 lock() 方法)会通过 LockSupport.park() 实现。虚拟线程的调度器能识别这种“协作式阻塞”,在虚拟线程阻塞时,会自动将其从平台线程上“解除挂载”,释放平台线程去执行其他任务。
    → 结果:平台线程不被卡住,继续高效复用,符合虚拟线程的设计初衷。

为什么两者“级别不同”?

  • synchronized 是 JVM 底层实现,阻塞时直接关联操作系统线程状态,虚拟线程无法干预(非协作)。
  • ReentrantLock 是 Java 代码层面的实现,阻塞时通过 JDK 提供的工具(如 LockSupport)通知调度器,虚拟线程可以主动释放平台线程(协作)。

这就是为什么在虚拟线程中,推荐用 ReentrantLock 替代 synchronized:前者不会阻塞平台线程,后者会。

总结

在虚拟线程中,synchronizedReentrantLock 的核心区别不是“是否阻塞”,而是阻塞时是否会导致平台线程(携带器)被卡住

  • synchronized 会卡住平台线程 → 降低虚拟线程吞吐量;
  • ReentrantLock 不会卡住平台线程 → 保持虚拟线程的轻量优势。

这也是 Java 官方在虚拟线程文档中特别建议用 ReentrantLock 替代 synchronized 的原因。

理解

也就是说 都会阻塞 平台线程,但是 synchronized 只会呆住,reentrantLock 会处理一下 虚拟线程连接之类,使得 阻塞 解决 是吧

可以这么理解,但更准确的逻辑是:

  • synchronized 阻塞时:会直接让平台线程(携带器)彻底卡住,既不能继续执行当前虚拟线程,也不能被调度去执行其他虚拟线程,相当于“浪费”了平台线程资源。
  • ReentrantLock 阻塞时:虚拟线程的调度器会主动把这个虚拟线程从平台线程上“摘下来”(解除挂载),让平台线程可以去执行其他虚拟线程,等阻塞结束后再把这个虚拟线程“挂回去”(重新挂载)。

所以两者的本质区别是:synchronized 会让平台线程“呆死”,而 ReentrantLock 能让平台线程“灵活复用”——这也是虚拟线程能实现高吞吐量的关键设计之一。

http://www.zskr.cn/news/31121.html

相关文章:

  • CF1060
  • 2025.10.24 测试
  • C_结构体学习_1
  • 量子力学作业3
  • 嵌入式音频开发很好的博主
  • 人工智能之编程基础 Python 入门:第一章 Python 的简介和安装
  • P5405 [CTS2019] 氪金手游 题解
  • 2025.10.26 闲话-单位根反演
  • 软考五
  • 转化漏斗(随笔)
  • 2025年摘星搜荐怎么样:全面评测摘星AI的功能与优势
  • 2025年店铺装修设计施工一体化服务推荐榜:覆盖服装店/餐厅/商场/健身房/美容院等全行业专业装修公司精选
  • 于听讲中积淀,在实践中成长
  • 应用安全 --- xx_vm 插件
  • 2025 年 10 月系统门窗十大品牌榜单揭晓,技术研发实力与市场口碑深度解读
  • 2025 年 10 月系统门窗十大品牌榜单揭晓,技术核心实力与市场口碑深度解读
  • 2025年中央空调主机保养/维修/清洗/维保/维护公司推荐排行榜,水处理维保,物业公司/医院/写字楼/商场中央空调主机维保厂家精选
  • 知行合一,方能致远
  • 乱学点东西#1 :二进制警报器
  • 【API接口】最新可用抖音用户信息解析接口
  • VMware 25H2安装完Kubuntu 25.10后的设置
  • 10/26/2025 一周总结
  • 2025 年 10 月门窗十大品牌榜单揭晓,技术研发实力与市场口碑全景解析
  • Valueof数据类型转换
  • 个人 Windows 电脑本地部署运行 DeepSeek 大模型
  • 2025年环保设备厂家权威推荐榜:废气处理、废水处理、噪音治理一站式解决方案,专业实力与高效服务深度解析
  • 生物信息与育种-全基因组选择/预测(GS/GP)合集【持续更新~】
  • 2025年锡膏厂家推荐排行榜,激光焊接锡膏,金锡Au-Sn锡膏,铟银锡合金高导热锡膏,水洗型锡膏,高温高铅锡膏,硅麦锡锑划线喷涂锡膏,Mini LED固晶锡膏,6号7号8号超细粉锡膏
  • 如何利用AI挖掘基因?一个很好的水稻例子
  • 一个通过深度学习整合多组学功能注释的基因组预测模型DeepAnnotation