[java 虚拟线程 ]

news/2025/10/26 21:53:51/文章来源:https://www.cnblogs.com/shiyuzhahan/p/19167469
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.mzph.cn/news/947082.shtml

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

相关文章

【ArcMap】按属性表复制字段并上移一段距离

将属性表中 LXMC 为 名称2 的字段复制并上移20米,在py编辑器中插入以下代码:# -*- coding: utf-8 -*- import arcpy import os import sys# 重新加载sys并设置默认编码 reload(sys) sys.setdefaultencoding(utf-8)# …

WPF 关闭程序 Aforge摄像头关闭不了 问题

public static Bitmap StaticBitmap = new Bitmap(100,100); public void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs){lock (StaticHelper.StaticBitmap){using (Bitmap b = (Bitmap)eventArgs.Frame)…

CF1060

题目 C(Hard Version) 因为制造两个2的倍数只需至多两次操作,因此按价格排序后,选择方案只有\(1+i\),\(i\) 和 \(1\) 三种,直接判断即可。\(\Omicron(n\ln{n})\) D 按树的深度进行奇偶分类,从叶节点开始删除,设当前奇…

以专注筑基,以实践致远

以专注筑基,以实践致远——三篇文章带给我的学习启示 细读三篇关于学习与成长的文章,仿佛为我混乱的大学学习状态点亮了一盏明灯。从Scalers强调的课堂专注,到娄老师践行的刻意训练与“做中学”,字里行间的真知灼见…

2025.10.24 测试

2025.10.24 测试提高组模拟赛, shanganze 2h AK me 只会两道,被踩爆了 把简单题想复杂了,写太慢了 1. 谔谔,不知道为什么浪费好长时间 就做个前缀和 然后想用 set 但求不了 个数 然后写了个线段树 2. 一眼 每一列答…

102302139 尚子骐 数据采集与融合作业1

作业一: 1. 完整代码以及运行结果点击查看代码 import requests from bs4 import BeautifulSoup import timedef get_university_ranking(url):try:headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64…

CF1152F2 Neko Rules the Catniverse (Large Version) 题解

\(\text{CF1152F2 Neko Rules the Catniverse (Large Version) 题解}\) 这个题有点意思啊。 我们大胆猜想这个题的 dp 是从每个星球一个一个线性转移的。得到这个结论有两种方式: 法一:发现按照 Neko 飞行的轨迹直接…

Audacity:开源音频编辑器的完整指南

Audacity是一款功能强大的开源音频编辑器和录音软件,支持多轨编辑、多种音频格式导入导出、实时效果处理等专业功能,适用于Windows、macOS和Linux等操作系统。Audacity:开源音频编辑器的完整指南 项目概述 Audacity…

【CI130x】音频传输的数据结构——FreeRTOS的消息队列

一句话概括 xQueueCreate 是 FreeRTOS 实时操作系统中用于动态创建消息队列的函数。它负责分配内存并返回一个可以用于发送和接收数据的队列句柄。详细解释 1. 什么是消息队列? 在深入函数本身之前,理解“队列”的概…

123456789

看到题目条件找一下性质然后将其转化掉。 任何东西都只是方向,不一定是正解。 如果感觉他答案不大并要求输出类似最小步数的时候可以猜一下答案上界。 可以从最特殊的东西入手。 可以适当找一下必要条件或充分条件。 …

#20232408 2025-2026-1 《网络系统与攻防技术》实验三实验报告 - 20232408

北京电子科技学院(BESTI) 实 验 报 告课程名称: 网络与系统攻防技术实验序号: 实验三实验名称: 免杀原理与实践学 号: 20232408姓 名: 李易骋指导老师: 王志强必修/选修: 必修实验日期: 20…

C_结构体学习_1

这里记录一下怎么为结构体成员变量实现内存连续且为动态 #include <iostream> #include <conio.h> #include <stdlib.h> #include <string.h> #include <stdio.h> using namespace std;…

嵌入式音频开发很好的博主

1。 https://xintiaobao.blog.csdn.net/ CSDN 博主:心跳包2。 https://segmentfault.com/u/junyidedalianmao/articles 21ic 博主:启英AI平台

人工智能之编程基础 Python 入门:第一章 Python 的简介和安装

人工智能之编程基础 Python 入门:第一章 Python 的简介和安装人工智能之编程基础 Python 入门 第一章 Python 的简介和安装前言 当前人工智能逐渐成为主流趋势,而python作为主流算法语言之一,也一跃登顶最受欢迎的语…

P5405 [CTS2019] 氪金手游 题解

P5405 [CTS2019] 氪金手游 题解 首先需要发现的是题目给出的条件等价于是限制所有卡形成了一棵树,但树边的方向是不确定的。从其它地方不好入手,不妨先考虑这棵树边全都从父亲指向儿子的情形,换句话说就是根节点要比…

杂记选做 #1

bakas trick 其实就是不带删的尺取。 维护 \(l,mid,r\),开始时从 \(r\) 开始向左扩展 \(l\),记 \(mid=r\),维护 \(p_i\)(\(l\le i\le mid\))是 \([i,mid]\) 的元素的总权值。每次 \(l\) 向右走时如果没超过 \(mid…

20232319 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1实验实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧。 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 (2)通过…

数据采集与融合技术实践第一次作业

作业1 ## 代码以及相关图片点击查看代码 import requests from bs4 import BeautifulSoup#原本想把第一个页面设为base_url,之后以此为根据跳转其他页面的(获取排名31之后的学校信息),可惜未能做到 base_url = htt…

2025.10.26 闲话-单位根反演

2025.10.26 闲话-单位根反演起因正在和 zxk 探讨 k 叉 bostan-mori。 jijidawang:直接单位根反演。所以就来学习单位根反演了。 Part.1 主体 首先引入这样一个问题: 求: \[\sum_{i=0}^{\lfloor\frac{n}{2}\rfloor}{…