Java虚拟线程中的阻塞与解挂:同步锁的局限性与替代方案

Java虚拟线程中的阻塞与解挂:同步锁的局限性与替代方案

java虚拟线程旨在通过在阻塞时从载体线程上解挂来提升并发性能。然而,当虚拟线程执行`synchronized`代码块时,它会被“钉住”在载体线程上,导致载体线程一同阻塞,从而丧失虚拟线程的并发优势。为避免此问题,应优先使用`reentrantlock`等协同机制,以及java 19后已修改支持虚拟线程解挂的标准库阻塞方法。

Java虚拟线程与并发模型

Java虚拟线程(Project Loom的成果)是JDK 19中引入的一项重要特性,旨在大幅提升Java应用程序的并发能力。与传统的平台线程(OS线程)不同,虚拟线程是轻量级的,由Java运行时管理,可以创建数百万个而不会带来显著的资源开销。它们被多路复用(multiplex)到数量有限的平台线程(通常称为“载体线程”或“Carrier Thread”)上执行。

虚拟线程的核心优势在于其“解挂”(unmounting)机制。当一个虚拟线程执行I/O操作或调用某些阻塞方法而进入等待状态时,它会从其当前占用的载体线程上“解挂”,从而释放该载体线程去执行其他虚拟线程。一旦阻塞操作完成,虚拟线程会重新“挂载”(mounting)到可用的载体线程上继续执行。这种机制使得少数载体线程能够高效地服务大量虚拟线程,极大地提高了系统的吞吐量和资源利用率。

虚拟线程的“钉住”问题

尽管虚拟线程在大多数阻塞场景下都能实现高效的解挂,但存在一个重要的例外情况,即“钉住”(Pinning)问题。当虚拟线程在以下几种情况下执行代码时,它将无法从载体线程上解挂,而是会被“钉住”:

执行synchronized代码块或方法: 这是最常见且容易被忽视的钉住原因。当虚拟线程进入一个synchronized块时,它会独占锁,并且在持有锁期间,即使它内部执行了阻塞操作,也无法解挂。这意味着载体线程也会被阻塞,直到synchronized块执行完毕。执行本地方法(Native Method): 调用JNI(Java Native Interface)编写的本地方法时,虚拟线程也会被钉住。执行外部函数(Foreign Function): 通过新的外部函数与内存API(Foreign Function & Memory API)调用外部代码时,同样可能导致钉住。

钉住的后果是,虚拟线程的轻量级和高效解挂的优势在此刻被削弱。一个被钉住的虚拟线程会霸占一个载体线程,阻止该载体线程去服务其他等待的虚拟线程,从而降低了整个系统的并发度。这与虚拟线程设计的初衷相悖。

立即学习“Java免费学习笔记(深入)”;

避免钉住:synchronized的替代方案

为了充分发挥虚拟线程的性能优势,开发者应尽量避免在虚拟线程中使用synchronized关键字进行同步。Java提供了更灵活、更适合虚拟线程模型的并发工具

使用 ReentrantLock

ReentrantLock是synchronized关键字的一个强大替代品,它提供了更细粒度的控制,并且关键在于,它被设计为与虚拟线程协同工作,允许在等待锁时解挂。

synchronized示例(导致钉住):

public class SynchronizedCounter {    private int count = 0;    public synchronized void increment() {        count++;        // 模拟一个阻塞操作,如果这里是I/O,载体线程会被钉住        // try { Thread.sleep(10); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }    }    public synchronized int getCount() {        return count;    }}

ReentrantLock示例(避免钉住):

Word-As-Image for Semantic Typography Word-As-Image for Semantic Typography

文字变形艺术字、文字变形象形字

Word-As-Image for Semantic Typography 62 查看详情 Word-As-Image for Semantic Typography

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockCounter {    private final ReentrantLock lock = new ReentrantLock();    private int count = 0;    public void increment() {        lock.lock(); // 获取锁        try {            count++;            // 模拟一个阻塞操作,这里虚拟线程可以解挂            // try { Thread.sleep(10); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }        } finally {            lock.unlock(); // 释放锁        }    }    public int getCount() {        lock.lock();        try {            return count;        } finally {            lock.unlock();        }    }}

在ReentrantLock的lock()方法内部,如果锁当前不可用,虚拟线程会进入等待状态并能够从载体线程上解挂,从而释放载体线程去执行其他任务。当锁可用时,虚拟线程会被重新挂载并获取锁继续执行。

其他协同阻塞机制

除了ReentrantLock,Java标准库中许多其他并发工具类也已在Java 19及更高版本中进行了修改,以支持虚拟线程的解挂。这些类包括但不限于:

java.util.concurrent.Semaphorejava.util.concurrent.CountDownLatchjava.util.concurrent.CyclicBarrierjava.util.concurrent.CompletableFuture各种java.util.concurrent.BlockingQueue实现甚至Thread.sleep()方法

这些方法在内部已经过适配,当虚拟线程调用它们并进入阻塞状态时,它们会与虚拟线程调度器协同,允许虚拟线程从载体线程上解挂。

虚拟线程如何“知道”何时等待?

虚拟线程本身并不具备某种“智能”来感知自己何时处于等待状态。这个机制是通过Java运行时(JVM)与标准库方法之间的紧密协作来实现的。

当一个虚拟线程调用一个例如ReentrantLock.lock()、CountDownLatch.await()或Thread.sleep()这样的阻塞方法时,这些方法内部的实现已经被修改,它们会显式地通知虚拟线程调度器,表明当前虚拟线程即将进入阻塞状态,并请求解挂。虚拟线程调度器收到这个信号后,便会将虚拟线程从其载体线程上移除,并将其置于等待队列中。当阻塞条件解除时(例如,锁被释放,倒计时结束,睡眠时间到达),调度器会重新将该虚拟线程安排到可用的载体线程上执行。

这种机制确保了只有那些明确设计为与虚拟线程协同的阻塞操作才能实现解挂,而像synchronized这样的底层JVM指令,由于其固有的实现方式,目前无法支持这种解挂行为,从而导致钉住。

总结

为了充分利用Java虚拟线程带来的并发优势,开发者必须理解并规避“钉住”问题。核心原则是避免在虚拟线程中使用synchronized关键字,转而采用ReentrantLock或其他Java并发包中提供的协同阻塞工具。这些工具以及其他如Thread.sleep()等标准库方法,在Java 19后已专门适配虚拟线程,能够确保在阻塞时虚拟线程可以正确解挂,从而释放载体线程,最大化系统的并发性能。正确地运用这些机制,将是构建高效、高吞吐量Java应用程序的关键。

以上就是Java虚拟线程中的阻塞与解挂:同步锁的局限性与替代方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/995840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
哔哩哔哩如何录制屏幕内容 哔哩哔哩游戏UP主的必备技能
上一篇 2025年12月1日 22:03:50
组装车能否上路? 能否自己组装踏板车?
下一篇 2025年12月1日 22:03:59

相关推荐

  • 出货量创历史新高,艾为电子2024年净利润同比增长399.83%

    艾为电子2024年业绩强劲增长,营收利润双双提升! ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 艾为电子近日发布2024年业绩快报,显示公司全年业绩实现大幅增长。具体数据如下:营业收入达293.29亿元,同比增长15.88%;营业利润23…

    2026年8月29日
    000
  • 苹果电脑全盘搜索文件技巧

    苹果电脑全盘搜索文件技巧苹果电脑全盘搜索文件技巧苹果电脑全盘搜索文件技巧苹果电脑全盘搜索文件技巧

    windows系统自带的搜索功能常常让人感到迟缓且功能单一。而相比之下,macos的全盘搜索不仅反应迅速,还具备强大的查找能力,能显著提升文件检索效率。下面将为你详细介绍如何在mac上高效使用这一便捷的搜索工具。 1、 点击屏幕右上角状态栏中的放大镜图标,即可打开SPOTLIGHT搜索窗口。 2、 …

    2026年8月29日 用户投稿
    100
  • 智能助手怎么处理多模态任务_AI理解图片语音和文本方法

    多模态智能助手通过多模态嵌入、注意力机制、Transformer架构和对比学习等技术,将图像、语音和文本统一表示并关联,实现跨模态理解与响应;实际应用中面临数据稀疏性、模态不对齐、异构性和计算复杂度等挑战;性能评估需结合单模态指标、跨模态指标、用户满意度及对抗性测试综合判断。 ☞☞☞AI 智能聊天,…

    2026年8月29日
    000
  • 如何使用Composer解决PHP包维护者激励问题?symfony/thanks助你轻松表达感谢

    可以通过一下地址学习composer:学习地址 在 php 开发中,我们常常依赖各种开源包,这些包的维护者们为我们提供了巨大的便利。然而,如何有效地支持和激励这些维护者们却一直是个问题。最近,我在项目中遇到了一个类似的难题:如何让这些维护者们知道我们对他们的工作是多么的感激? 我尝试了多种方法,包括…

    用户投稿 2026年8月29日
    200
  • 流畅阅读— 开源AI浏览器翻译插件,支持双语对照显示

    流畅阅读— 开源AI浏览器翻译插件,支持双语对照显示流畅阅读— 开源AI浏览器翻译插件,支持双语对照显示流畅阅读— 开源AI浏览器翻译插件,支持双语对照显示流畅阅读— 开源AI浏览器翻译插件,支持双语对照显示

    fluentread:你的浏览器翻译利器,助你畅享无障碍阅读体验! FluentRead是一款开源浏览器翻译插件,它利用先进的AI技术,旨在为你提供如同母语般流畅的阅读体验。支持多种翻译引擎,包括传统的机器翻译和强大的AI大模型,并且允许你自定义翻译服务。其核心功能包含智能翻译、便捷的双语对照显示以…

    2026年8月29日 用户投稿
    100
  • 电脑开机密码忘记了怎么办_Windows密码清除教程

    忘记电脑开机密码时,可通过windows安装u盘启动并进入命令提示符,替换utilman.exe为cmd.exe,重启后在登录界面打开命令提示符,使用net user命令重置密码;2. 数据安全方面,若未启用bitlocker全盘加密,重置密码后数据可被访问,因此需及时设置强密码并定期备份;3. 其…

    2026年8月29日
    000
  • 拼多多商家能取消订单吗?拼多多商家能取消退款吗

    答案:拼多多商家取消订单需根据状态选择处理方式。未发货订单可在工作台或APP操作取消;已发货订单须拦截物流并引导买家退款;退款申请不可强制取消,需协商或举证驳回;特殊场景如恶意下单、系统异常等需平台介入。 如果您作为拼多多商家,因库存、物流等原因需要取消已生成的订单或处理买家发起的退款申请,平台允许…

    2026年8月29日
    000
  • win10怎么关闭锁屏界面_win10禁用锁屏界面的设置教程

    1、通过组策略编辑器可禁用锁屏,适用于专业版系统;2、修改注册表添加NoLockScreen键值,适用于所有Windows 10版本;3、调整电源与睡眠设置防止因闲置自动锁屏;4、关闭屏幕保护程序及其登录要求,避免触发锁屏。重启后生效。 如果您在使用Windows 10时希望电脑不再显示锁屏界面,可…

    2026年8月29日
    000
  • 如何在持续集成中确保PHPUnit测试覆盖率达标?使用rregeer/phpunit-coverage-check可以!

    最近在进行一个PHP项目的持续集成时,我遇到了一个问题:如何确保PHPUnit的测试覆盖率达到预设的阈值?这个问题不仅影响了项目的质量控制,也增加了手动检查的负担。幸运的是,我找到了rregeer/phpunit-coverage-check这个工具,彻底解决了我的困扰。 可以通过一下地址学习com…

    用户投稿 2026年8月29日
    000
  • 快手小店新手怎么运营?快手小店入驻流程

    在短视频平台日益火爆的今天,快手小店作为一个新兴的电商渠道,吸引了大量商家和消费者的关注。对于新手来说,如何在快手小店中脱颖而出,实现高效运营呢?本文将为你详细解析快手小店新手运营的技巧,助你快速上手,打造爆款店铺。 一、了解快手小店 1. 快手小店概述 快手小店是快手平台推出的电商服务平台,允许用…

    2026年8月29日
    100
  • 《中国足球环境及未来发展白皮书(2025)》发布:100吋大屏电视成标配

    2025年,世俱杯的激情与“苏超”的热潮遥相呼应,掀起了一场全球范围内的足球盛宴。这份源自赛场内外的热情,不仅展现了足球运动的巨大魅力,也正逐步汇聚成推动中国足球环境改善的重要力量。 7月10日,由经济观察研究院发布的《中国足球环境及未来发展白皮书(2025)》(以下简称《白皮书》)引发广泛关注。该…

    2026年8月29日
    000
  • 微信公众号文章如何快速分享给朋友_微信公众号文章分享效率提升

    一、使用微信内置分享功能可直接发送文章给好友或群聊,二、创建快捷分享标签能快速选择常分享的联系人,三、利用电脑端微信同步发送提升操作效率,四、借助收藏功能实现多篇文章批量转发,五、生成文章链接便于跨平台传播扩大触达范围。 如果您希望将微信公众号文章迅速传递给朋友,但又受限于操作繁琐或效率低下,可以通…

    2026年8月29日
    200
  • 如何解决TYPO3中的重定向问题?使用Composer可以轻松搞定!

    可以通过以下地址学习 Composer:学习地址 在使用 typo3 cms 构建网站时,管理重定向是一个必不可少的任务。无论是网站迁移、url 结构调整,还是简单地修正错误链接,确保用户能够正确地导航到新位置是非常重要的。然而,当我第一次尝试在 typo3 中管理重定向时,遇到了不少问题。手动创建…

    用户投稿 2026年8月29日
    000
  • 使用 Java 编码单词:基于字母表的字符映射教程

    本文档旨在指导开发者如何使用 Java 编程语言,根据预定义的字母表将单词编码为字符序列。我们将详细介绍实现此功能的代码,解释关键步骤,并提供示例代码,确保编码过程能够准确地保留单词的原始顺序。本教程将涵盖字符大小写处理、循环优化以及结果输出等关键方面,帮助读者掌握字符编码的核心技术。 ### 字符…

    2026年8月29日
    000
  • 首款搭载海光4号处理器笔记本,联想开天X7定义信创PC旗舰性能

    北京,2025年7月10日——在今日举行的海光新一代pc处理器发布会上,联想开天作为核心战略合作伙伴,同步发布了一款面向国产信创领域的重磅新品——联想开天x7高性能信创旗舰笔记本。该产品不仅是全球首款配备海光4号处理器的笔记本电脑,更首次在国产笔记本中引入独立npu芯片,标志着国产“信创aipc”迈…

    2026年8月29日
    100
  • Dubbo消费者配置中“标签的id属性有什么作用?

    `标签的id属性作用” /> 深入理解Dubbo消费者配置中标签的id属性 在基于Dubbo框架的分布式系统中,消费者配置文件的标签扮演着关键角色,其id属性尤为重要。本文将详细解释中id=”timeservice”的具体作用。 这段配置代码声明了对名为cn.suiwei.serv…

    2026年8月29日
    000
  • Potplayer如何调整字幕同步_Potplayer字幕同步调整的详细步骤

    答案:调整PotPlayer字幕同步可通过快捷键微调、手动设置延迟、加载外部字幕、启用自动校正及修改渲染器实现。1、字幕慢则按Ctrl+下,快则按Ctrl+上,每次调整50毫秒;2、右键→字幕→字幕时间调整→手动输入延迟值(正为延后,负为提前);3、将同名字幕文件与视频放同一目录,右键加载字幕并微调…

    2026年8月29日
    000
  • 如何解决Swagger/OpenAPI规范的管理问题?使用Composer可以轻松搞定!

    可以通过以下地址学习 composer:学习地址 在开发 API 时,管理和操作 Swagger/OpenAPI 规范常常是一项复杂且耗时的任务。我曾在一个项目中遇到过这样的问题:需要频繁地修改和更新 Swagger 文档,手动操作不仅容易出错,还非常低效。最终,我通过 Composer 安装了 e…

    用户投稿 2026年8月29日
    000
  • win10连不上wifi怎么解决_win10连不上wifi解决方案

    首先检查飞行模式和Wi-Fi开关是否开启,再重启调制解调器与路由器;接着运行网络疑难解答,更新或重装无线网卡驱动,最后通过设置重置网络配置以恢复默认状态。 如果您尝试连接Wi-Fi网络,但Windows 10设备无法检测到可用网络或连接失败,可能是由于驱动程序、系统设置或硬件开关问题所致。以下是解决…

    2026年8月29日
    100
  • 完美世界入选“2025高品质消费品牌TOP100”榜单

    7月10日,南方都市报联合广东连锁经营协会发布“2025高品质消费品牌top100”榜单,完美世界股份有限公司成功入选,并荣获“年度十大消费科技创新品牌”奖项,彰显其在高品质兴趣消费领域的引领地位。 在数字经济时代,数字内容产品已成为大众文化精神生活的重要组成部分。以数字游戏、电子竞技、影视作品为代…

    2026年8月29日
    000

发表回复

登录后才能评论
关注微信