虚拟线程的pinned问题终于被jdk25完美解决了

虚拟线程是一个非常有用的特征,但是JDK25以前,一直存在pinned问题,一些场景下会导致平台线程被占用无法释放。

比如下面的代码,在JDK 21下运行时,会卡住:

import java.time.Duration;
import java.util.concurrent.Executors;public class VirtualThreadPinningDemo {// 一个共享资源,我们将使用 synchronized 来保护它private static final Object sharedLock = new Object();public static void main(String[] args) {// 使用虚拟线程执行器创建大量虚拟线程try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {for (int i = 0; i < 100; i++) {int taskId = i;executor.submit(() -> performTask(taskId));}}System.out.println("All tasks completed.");}private static void performTask(int id) {System.out.printf("Task %d started on thread: %s%n", id, Thread.currentThread());// 情况1:在 synchronized 块内进行阻塞操作 -> 会导致 PINNEDsynchronized (sharedLock) {System.out.printf("Task %d acquired lock. Thread: %s%n", id, Thread.currentThread());try {// 模拟一个阻塞操作,比如睡眠或I/O// 在 synchronized 块内睡眠,虚拟线程无法被卸载,平台线程被占用!Thread.sleep(Duration.ofSeconds(2));} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.printf("Task %d released lock.%n", id);}System.out.printf("Task %d finished.%n", id);}
}

  运行结果:

Task 0 started on thread: VirtualThread[#30]/runnable@ForkJoinPool-1-worker-1
Task 0 acquired lock. Thread: VirtualThread[#30]/runnable@ForkJoinPool-1-worker-1
Task 1 started on thread: VirtualThread[#32]/runnable@ForkJoinPool-1-worker-10
Task 4 started on thread: VirtualThread[#35]/runnable@ForkJoinPool-1-worker-9
Task 5 started on thread: VirtualThread[#36]/runnable@ForkJoinPool-1-worker-5
Task 6 started on thread: VirtualThread[#37]/runnable@ForkJoinPool-1-worker-6
Task 7 started on thread: VirtualThread[#38]/runnable@ForkJoinPool-1-worker-8
Task 2 started on thread: VirtualThread[#33]/runnable@ForkJoinPool-1-worker-3
Task 8 started on thread: VirtualThread[#39]/runnable@ForkJoinPool-1-worker-7
Task 9 started on thread: VirtualThread[#40]/runnable@ForkJoinPool-1-worker-2
Task 10 started on thread: VirtualThread[#41]/runnable@ForkJoinPool-1-worker-4
Task 11 started on thread: VirtualThread[#42]/runnable@ForkJoinPool-1-worker-11
Task 12 started on thread: VirtualThread[#43]/runnable@ForkJoinPool-1-worker-13
Task 14 started on thread: VirtualThread[#45]/runnable@ForkJoinPool-1-worker-14
Task 13 started on thread: VirtualThread[#44]/runnable@ForkJoinPool-1-worker-12
Task 15 started on thread: VirtualThread[#46]/runnable@ForkJoinPool-1-worker-15
Task 16 started on thread: VirtualThread[#47]/runnable@ForkJoinPool-1-worker-16
Task 0 released lock.
Task 0 finished.
Task 17 started on thread: VirtualThread[#48]/runnable@ForkJoinPool-1-worker-1
这里就卡住不向下走了

  

但是同样的代码,在JDK 25下,运行正常:

Task 2 started on thread: VirtualThread[#42]/runnable@ForkJoinPool-1-worker-3
Task 2 acquired lock. Thread: VirtualThread[#42]/runnable@ForkJoinPool-1-worker-3
Task 0 started on thread: VirtualThread[#37]/runnable@ForkJoinPool-1-worker-6
Task 3 started on thread: VirtualThread[#45]/runnable@ForkJoinPool-1-worker-6
Task 1 started on thread: VirtualThread[#39]/runnable@ForkJoinPool-1-worker-6
Task 4 started on thread: VirtualThread[#47]/runnable@ForkJoinPool-1-worker-6
Task 5 started on thread: VirtualThread[#48]/runnable@ForkJoinPool-1-worker-6
Task 7 started on thread: VirtualThread[#50]/runnable@ForkJoinPool-1-worker-6
Task 8 started on thread: VirtualThread[#53]/runnable@ForkJoinPool-1-worker-6
Task 9 started on thread: VirtualThread[#54]/runnable@ForkJoinPool-1-worker-6
Task 10 started on thread: VirtualThread[#55]/runnable@ForkJoinPool-1-worker-6
Task 11 started on thread: VirtualThread[#56]/runnable@ForkJoinPool-1-worker-6
Task 12 started on thread: VirtualThread[#57]/runnable@ForkJoinPool-1-worker-6
Task 13 started on thread: VirtualThread[#58]/runnable@ForkJoinPool-1-worker-6
Task 15 started on thread: VirtualThread[#60]/runnable@ForkJoinPool-1-worker-6
Task 16 started on thread: VirtualThread[#61]/runnable@ForkJoinPool-1-worker-6
Task 14 started on thread: VirtualThread[#59]/runnable@ForkJoinPool-1-worker-6
Task 17 started on thread: VirtualThread[#62]/runnable@ForkJoinPool-1-worker-6
Task 19 started on thread: VirtualThread[#64]/runnable@ForkJoinPool-1-worker-6
Task 18 started on thread: VirtualThread[#63]/runnable@ForkJoinPool-1-worker-6
Task 6 started on thread: VirtualThread[#49]/runnable@ForkJoinPool-1-worker-6
Task 21 started on thread: VirtualThread[#67]/runnable@ForkJoinPool-1-worker-6
Task 20 started on thread: VirtualThread[#66]/runnable@ForkJoinPool-1-worker-6
Task 22 started on thread: VirtualThread[#68]/runnable@ForkJoinPool-1-worker-6
Task 23 started on thread: VirtualThread[#69]/runnable@ForkJoinPool-1-worker-6
Task 24 started on thread: VirtualThread[#70]/runnable@ForkJoinPool-1-worker-6
Task 26 started on thread: VirtualThread[#72]/runnable@ForkJoinPool-1-worker-6
Task 25 started on thread: VirtualThread[#71]/runnable@ForkJoinPool-1-worker-6
Task 27 started on thread: VirtualThread[#73]/runnable@ForkJoinPool-1-worker-6
Task 28 started on thread: VirtualThread[#74]/runnable@ForkJoinPool-1-worker-3
Task 31 started on thread: VirtualThread[#77]/runnable@ForkJoinPool-1-worker-7
Task 30 started on thread: VirtualThread[#76]/runnable@ForkJoinPool-1-worker-7
Task 32 started on thread: VirtualThread[#78]/runnable@ForkJoinPool-1-worker-7
Task 29 started on thread: VirtualThread[#75]/runnable@ForkJoinPool-1-worker-7
Task 33 started on thread: VirtualThread[#79]/runnable@ForkJoinPool-1-worker-7
Task 34 started on thread: VirtualThread[#80]/runnable@ForkJoinPool-1-worker-7
Task 35 started on thread: VirtualThread[#81]/runnable@ForkJoinPool-1-worker-7
Task 36 started on thread: VirtualThread[#82]/runnable@ForkJoinPool-1-worker-7
Task 37 started on thread: VirtualThread[#83]/runnable@ForkJoinPool-1-worker-7
Task 38 started on thread: VirtualThread[#84]/runnable@ForkJoinPool-1-worker-7
Task 39 started on thread: VirtualThread[#85]/runnable@ForkJoinPool-1-worker-7
Task 41 started on thread: VirtualThread[#87]/runnable@ForkJoinPool-1-worker-7
Task 42 started on thread: VirtualThread[#88]/runnable@ForkJoinPool-1-worker-7
Task 40 started on thread: VirtualThread[#86]/runnable@ForkJoinPool-1-worker-7
Task 43 started on thread: VirtualThread[#89]/runnable@ForkJoinPool-1-worker-7
Task 44 started on thread: VirtualThread[#90]/runnable@ForkJoinPool-1-worker-7
Task 45 started on thread: VirtualThread[#91]/runnable@ForkJoinPool-1-worker-7
Task 46 started on thread: VirtualThread[#92]/runnable@ForkJoinPool-1-worker-7
Task 47 started on thread: VirtualThread[#93]/runnable@ForkJoinPool-1-worker-7
Task 48 started on thread: VirtualThread[#94]/runnable@ForkJoinPool-1-worker-7
Task 49 started on thread: VirtualThread[#95]/runnable@ForkJoinPool-1-worker-7
Task 50 started on thread: VirtualThread[#96]/runnable@ForkJoinPool-1-worker-7
Task 51 started on thread: VirtualThread[#97]/runnable@ForkJoinPool-1-worker-7
Task 52 started on thread: VirtualThread[#98]/runnable@ForkJoinPool-1-worker-7
Task 53 started on thread: VirtualThread[#99]/runnable@ForkJoinPool-1-worker-7
Task 54 started on thread: VirtualThread[#100]/runnable@ForkJoinPool-1-worker-7
Task 55 started on thread: VirtualThread[#101]/runnable@ForkJoinPool-1-worker-7
Task 56 started on thread: VirtualThread[#102]/runnable@ForkJoinPool-1-worker-7
Task 58 started on thread: VirtualThread[#104]/runnable@ForkJoinPool-1-worker-7
Task 59 started on thread: VirtualThread[#105]/runnable@ForkJoinPool-1-worker-7
Task 57 started on thread: VirtualThread[#103]/runnable@ForkJoinPool-1-worker-7
Task 60 started on thread: VirtualThread[#106]/runnable@ForkJoinPool-1-worker-7
Task 62 started on thread: VirtualThread[#108]/runnable@ForkJoinPool-1-worker-7
Task 63 started on thread: VirtualThread[#109]/runnable@ForkJoinPool-1-worker-7
Task 61 started on thread: VirtualThread[#107]/runnable@ForkJoinPool-1-worker-7
Task 64 started on thread: VirtualThread[#110]/runnable@ForkJoinPool-1-worker-7
Task 66 started on thread: VirtualThread[#112]/runnable@ForkJoinPool-1-worker-7
Task 65 started on thread: VirtualThread[#111]/runnable@ForkJoinPool-1-worker-7
Task 67 started on thread: VirtualThread[#113]/runnable@ForkJoinPool-1-worker-7
Task 68 started on thread: VirtualThread[#114]/runnable@ForkJoinPool-1-worker-7
Task 69 started on thread: VirtualThread[#115]/runnable@ForkJoinPool-1-worker-7
Task 70 started on thread: VirtualThread[#116]/runnable@ForkJoinPool-1-worker-7
Task 71 started on thread: VirtualThread[#117]/runnable@ForkJoinPool-1-worker-7
Task 72 started on thread: VirtualThread[#118]/runnable@ForkJoinPool-1-worker-7
Task 73 started on thread: VirtualThread[#119]/runnable@ForkJoinPool-1-worker-7
Task 74 started on thread: VirtualThread[#120]/runnable@ForkJoinPool-1-worker-7
Task 75 started on thread: VirtualThread[#121]/runnable@ForkJoinPool-1-worker-7
Task 76 started on thread: VirtualThread[#122]/runnable@ForkJoinPool-1-worker-7
Task 77 started on thread: VirtualThread[#123]/runnable@ForkJoinPool-1-worker-7
Task 78 started on thread: VirtualThread[#124]/runnable@ForkJoinPool-1-worker-7
Task 79 started on thread: VirtualThread[#125]/runnable@ForkJoinPool-1-worker-7
Task 80 started on thread: VirtualThread[#126]/runnable@ForkJoinPool-1-worker-7
Task 81 started on thread: VirtualThread[#127]/runnable@ForkJoinPool-1-worker-7
Task 82 started on thread: VirtualThread[#128]/runnable@ForkJoinPool-1-worker-7
Task 83 started on thread: VirtualThread[#129]/runnable@ForkJoinPool-1-worker-7
Task 84 started on thread: VirtualThread[#130]/runnable@ForkJoinPool-1-worker-7
Task 85 started on thread: VirtualThread[#131]/runnable@ForkJoinPool-1-worker-7
Task 86 started on thread: VirtualThread[#132]/runnable@ForkJoinPool-1-worker-7
Task 88 started on thread: VirtualThread[#134]/runnable@ForkJoinPool-1-worker-7
Task 87 started on thread: VirtualThread[#133]/runnable@ForkJoinPool-1-worker-7
Task 89 started on thread: VirtualThread[#135]/runnable@ForkJoinPool-1-worker-7
Task 90 started on thread: VirtualThread[#136]/runnable@ForkJoinPool-1-worker-7
Task 91 started on thread: VirtualThread[#137]/runnable@ForkJoinPool-1-worker-7
Task 92 started on thread: VirtualThread[#138]/runnable@ForkJoinPool-1-worker-7
Task 93 started on thread: VirtualThread[#139]/runnable@ForkJoinPool-1-worker-7
Task 94 started on thread: VirtualThread[#140]/runnable@ForkJoinPool-1-worker-7
Task 95 started on thread: VirtualThread[#141]/runnable@ForkJoinPool-1-worker-8
Task 97 started on thread: VirtualThread[#143]/runnable@ForkJoinPool-1-worker-8
Task 96 started on thread: VirtualThread[#142]/runnable@ForkJoinPool-1-worker-8
Task 98 started on thread: VirtualThread[#144]/runnable@ForkJoinPool-1-worker-3
Task 99 started on thread: VirtualThread[#145]/runnable@ForkJoinPool-1-worker-3
Task 2 released lock.
Task 2 finished.
Task 0 acquired lock. Thread: VirtualThread[#37]/runnable@ForkJoinPool-1-worker-7
Task 0 released lock.
Task 0 finished.
Task 3 acquired lock. Thread: VirtualThread[#45]/runnable@ForkJoinPool-1-worker-5
Task 3 released lock.
Task 3 finished.
Task 1 acquired lock. Thread: VirtualThread[#39]/runnable@ForkJoinPool-1-worker-7
Task 1 released lock.
Task 1 finished.
Task 4 acquired lock. Thread: VirtualThread[#47]/runnable@ForkJoinPool-1-worker-5
Task 4 released lock.
Task 4 finished.
Task 5 acquired lock. Thread: VirtualThread[#48]/runnable@ForkJoinPool-1-worker-7
Task 5 released lock.
Task 5 finished.
Task 7 acquired lock. Thread: VirtualThread[#50]/runnable@ForkJoinPool-1-worker-8
Task 7 released lock.
Task 7 finished.
Task 8 acquired lock. Thread: VirtualThread[#53]/runnable@ForkJoinPool-1-worker-8
Task 8 released lock.
Task 8 finished.
Task 9 acquired lock. Thread: VirtualThread[#54]/runnable@ForkJoinPool-1-worker-6
Task 9 released lock.
Task 9 finished.
Task 10 acquired lock. Thread: VirtualThread[#55]/runnable@ForkJoinPool-1-worker-8
Task 10 released lock.
Task 10 finished.
Task 11 acquired lock. Thread: VirtualThread[#56]/runnable@ForkJoinPool-1-worker-2
Task 11 released lock.
Task 11 finished.
Task 12 acquired lock. Thread: VirtualThread[#57]/runnable@ForkJoinPool-1-worker-8
Task 12 released lock.
Task 12 finished.
Task 13 acquired lock. Thread: VirtualThread[#58]/runnable@ForkJoinPool-1-worker-7
Task 13 released lock.
Task 13 finished.
Task 15 acquired lock. Thread: VirtualThread[#60]/runnable@ForkJoinPool-1-worker-7
Task 15 released lock.
Task 15 finished.
Task 16 acquired lock. Thread: VirtualThread[#61]/runnable@ForkJoinPool-1-worker-5
Task 16 released lock.
Task 16 finished.
Task 14 acquired lock. Thread: VirtualThread[#59]/runnable@ForkJoinPool-1-worker-2
Task 14 released lock.
Task 14 finished.
Task 17 acquired lock. Thread: VirtualThread[#62]/runnable@ForkJoinPool-1-worker-8
Task 17 released lock.
Task 17 finished.
Task 19 acquired lock. Thread: VirtualThread[#64]/runnable@ForkJoinPool-1-worker-8
Task 19 released lock.
Task 19 finished.
Task 18 acquired lock. Thread: VirtualThread[#63]/runnable@ForkJoinPool-1-worker-2
Task 18 released lock.
Task 18 finished.
... 会一直正常执行,直到运行结束

  

附:不熟悉虚拟线程pinned问题的,可自行问deepseek

image

 

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

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

相关文章

077_尚硅谷_单分支基本使用

077_尚硅谷_单分支基本使用1.单分支基本介绍2.例题判断是否18岁

【比赛记录】2025NOIP 冲刺模拟赛合集I

2025CSP-S模拟赛64A B C D Sum Rank50 0 0 - 50 7/7挂 155pts,挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂挂…

12 继承--instanceof和类型转换

12 继承--instanceof和类型转换多态 父类的引用指向子类的类型 Father f = new Son(); 而能执行的方法只看左边的类型. 父类可以指向子类,但不能调用子类独有的方法 如果非要调用,可以进行强制类型转换.注意事项:多态是…

C0214 拔树游戏 题解

C0214 拔树游戏 题解C0214 拔树游戏 题解 这道题挺有趣的。 不难发现每一次的拔树操作就是对一个根节点的所有子节点(只是下一层)取最小点权的那个节点取代本身。同时发现,因为每次取的节点都是最小的,所以在堆…

CSDN Markdown 编辑器快捷键大全 - 实践

CSDN Markdown 编辑器快捷键大全 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

P4168 [Violet] 蒲公英题解

P4168 [Violet] 蒲公英题解洛谷题目链接:[Violet] 蒲公英 一道分块好题,调了整整一上午一句话题意:在线求区间众数 考虑到众数没有可加性,所以一般数据结构是不好维护的,这个时候就要用分块了,分块可以维护一些数…

Java了解

Java了解了解Java Java的特性与优势 简单性、面向对象、可移植性、高性能、分布式 动态性(反射机制)、多线程、安全性、健壮性 Java的三大版本与有关工具 Java SE Java ME Java EEJDK:Java Development Kit(包含JRE)…

VGG使用块的网络

VGG使用块的网络 一.手写VGG架构import torch from torch import nn import d2l #1.VGG块 def VGG_block(nums_conv,in_chanels,out_chanels):#卷积层数,输入通道数,输出通道数layers=[]#一个VGG里面的层for i in ra…

使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统

一 系统功能设计 采用SpringBoot + Thymeleaf + MyBatisPlus技术栈实现一个简单的书籍管理系统,包含以下功能:书籍列表展示 书籍添加 书籍编辑 书籍删除 书籍查询(按条件筛选)二 数据库设计 SET NAMES utf8mb4; SE…

创业思路

创业思路ai p图, 人工后期校验, 人工p, 然后把图片给手机壳制作厂, 卖给提供照片的人. diy手机壳. 比如他本人的照片加风景, 比如巴黎铁塔

详细介绍:Java-Spring入门指南(十九)thymeleaf基本概念

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P2605 [ZJOI2010] 基站选址

题目概述 题目链接:https://www.luogu.com.cn/problem/P2605。 有 \(n\) 个村庄,你需要建立不超过 \(k\) 个基站,每一户人家都有参数 \(d_i,s_i,w_i,c_i\) 分别表示距离第一户人家的距离、在不超过 \(s_i\) 的地方有…

NVIDIA Jetson AGX Xavier刷机教程

NVIDIA Jetson AGX Xavier刷机教程 @目录NVIDIA Jetson AGX Xavier刷机教程1.下载SdkManager2.安装SdkManager3.刷机 1.下载SdkManager 进入SdkManager官网下载SdkManager的deb版本 注意,ubuntu的24.04版本暂时不支持…

洛谷p1462-通往奥格瑞码道路

题目:https://www.luogu.com.cn/problem/P1462 思考过程: 刚拿到这个题,我把消耗的血量和路费当成了负权边去考虑,考虑到我们只需要考虑扣钱的最优,并且在血量扣尽之前达到就好,那我觉得可以用一个数组hp来代表实…

详细介绍:VR 太阳光参数与快速渲染

详细介绍:VR 太阳光参数与快速渲染pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

位运算中没用的小技巧

位运算那些没用的小技巧消去最后一位的1 x & (x - 1)交换两个数 a ^= b; b ^= a; a ^= b;检查一个数的奇偶 x & 1求x的绝对值 ~(x >> 31) ? a : ~a + 1取两个数的最大值 x ^ ((x ^ y) & -(x < y…

超越基础:SightAI 智能路由与多模型选择实战 - sight

在第一周的入门指南中,我们已经学会了如何使用 SightAI 的基础 API 调用,实现了一个简单的对话交互。不少开发者会面临新的需求:想降低推理成本时,如何找到性价比更高的模型?追求交互速度时,怎样获取更快的响应?…

kafka连接认证

kafka连接认证明白,我帮你整理一份 Kafka 客户端三阶段检查完整文档,涵盖原理、检查目的、可能异常、排查方法以及你之前脚本逻辑对应的解释。文档形式清晰,方便阅读和运维参考。Kafka 客户端三阶段连接检查完整文档…

[Vulhub靶机]JARBAS靶机渗透

[Vulhub靶机]JARBAS靶机渗透 靶机搭建 下载地址: https://download.vulnhub.com/jarbas/Jarbas.zip 下载后设置nat模式即可与攻击机同一网段 kali:192.168.88.1331.信息收集 主机发现 首先对C段进行扫描,发现131这台主…