当前位置: 首页 > 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.jsqmd.com/news/22980/

相关文章:

  • 【ArcMap】按属性表复制字段并上移一段距离
  • WPF 关闭程序 Aforge摄像头关闭不了 问题
  • 102302139 尚子骐 数据采集与融合作业1
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
  • Audacity:开源音频编辑器的完整指南
  • 【CI130x】音频传输的数据结构——FreeRTOS的消息队列
  • 123456789
  • #20232408 2025-2026-1 《网络系统与攻防技术》实验三实验报告 - 20232408
  • C_结构体学习_1
  • 量子力学作业3
  • 嵌入式音频开发很好的博主
  • 人工智能之编程基础 Python 入门:第一章 Python 的简介和安装
  • P5405 [CTS2019] 氪金手游 题解
  • 杂记选做 #1
  • 20232319 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 数据采集与融合技术实践第一次作业
  • 2025.10.26 闲话-单位根反演
  • 题解:B4205 [常州市赛 2021] 特殊字符
  • 郭念海 - coder
  • 软考五
  • ECC 学习笔记
  • Halcon算法——区域生长
  • [TOOL] Node.js: JavaScript运行环境安装
  • 转化漏斗(随笔)
  • 20231326《密码系统设计》第五周预习报告
  • 2025年实木家具厂家权威推荐榜:原木/全实木/北美黑胡桃/樱桃木/榫卯工艺/高端定制/全屋整装,烘干/白胚/木蜡油保养工艺深度解析
  • 2025年摘星搜荐怎么样:全面评测摘星AI的功能与优势
  • 2025年工业清洗剂厂家推荐排行榜,水洗/水基/碳氢/铝材/超声波/金属/真空/除油/防锈清洗剂源头厂家精选
  • GoroSort
  • Windows11文件夹右键-删除多余选项-加快打开速度