0

0

Java虚拟线程调度与内存可见性:无需因载体线程切换而使用volatile

碧海醫心

碧海醫心

发布时间:2026-01-27 22:08:12

|

153人浏览过

|

来源于php中文网

原创

Java虚拟线程调度与内存可见性:无需因载体线程切换而使用volatile

java虚拟线程可在生命周期内被调度到不同载体线程上执行,但jmm保证其行为仍等同于单个java线程——因此无需为字段添加volatile修饰符来应对载体切换,同步语义与平台线程完全一致。

在Java 21引入的虚拟线程(Virtual Threads)模型中,一个常见误解是:“虚拟线程一旦绑定某个载体线程(Carrier Thread,即OS线程),就会始终在其上运行”。事实恰恰相反。根据JEP 425 的明确说明:

A virtual thread can be scheduled on different carriers over the course of its lifetime.

这意味着:当虚拟线程因I/O(如数据库查询 getNextUserFromDb())而阻塞时,JVM可将其挂起,并在恢复时将其调度到另一个空闲的载体线程上继续执行——整个过程对开发者透明。

然而,关键在于:Java内存模型(JMM)的同步语义不以OS线程为单位,而是以Java线程为单位。虚拟线程在JMM中被视为一个独立的、不可分割的Thread实例。无论它在底层由多少个不同的OS线程承载,JMM均保证:

  • 同一虚拟线程内的所有操作遵循程序顺序(Program Order)
  • 对该线程内共享变量的读写,满足线程内Happens-Before关系
  • 虚拟线程的阻塞/唤醒(如Thread.sleep()、BlockingQueue.take()、NIO channel read等)本身构成同步点,隐式建立Happens-Before边,确保之前写入的变量对后续读取可见。

因此,回到示例代码:

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

AVCLabs
AVCLabs

AI移除视频背景,100%自动和免费

下载
public class VirtualThreadDemo {
    private int disabledUserCount; // ✅ 不需要 volatile

    void countDisabledUsers() {
        while (moreUsers()) {
            User user = getNextUserFromDb(); // 阻塞点:可能切换载体线程
            if (user.isDisabled())
                disabledUserCount++; // ✅ 此处递增始终对本虚拟线程后续操作可见
        }
        System.out.println(disabledUserCount); // ✅ 最终值正确
    }
}

disabledUserCount 是实例变量,被单个虚拟线程独占访问(无其他线程并发修改),因此:

  • 不需要 volatile(无跨线程可见性需求);
  • 不需要 synchronized(无竞态条件);
  • 更不需要 AtomicInteger(无原子性增强需求)。

同样,若改为局部变量:

void countDisabledUsers() {
    int localCount = 0; // ✅ 完全线程私有,绝对安全
    while (moreUsers()) {
        User user = getNextUserFromDb();
        if (user.isDisabled()) localCount++;
    }
    System.out.println(localCount);
}

局部变量天然存储在每个虚拟线程独立的帧中,与载体线程切换完全无关,安全性更高。

⚠️ 注意事项

  • 若多个虚拟线程(或混合平台线程)并发访问同一共享状态(如实例字段、静态字段、外部缓存等),则仍需传统同步机制(synchronized、ReentrantLock、volatile、原子类等)——这与是否使用虚拟线程无关,只取决于实际并发模型
  • volatile 的作用是解决跨Java线程的可见性问题,而非“跨载体线程”。载体线程切换不引入新的Java线程上下文,故不触发JMM的可见性担忧。

总结
虚拟线程的调度灵活性(多载体支持)与其内存语义的严谨性(单Java线程视角)是正交设计。开发者可像编写传统单线程逻辑一样编写虚拟线程代码——专注业务逻辑,无需为底层调度细节增加volatile、内存屏障或额外同步。真正的并发控制边界,始终由Java线程数量与共享数据范围决定,而非OS线程映射方式。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

502

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

87

2025.12.01

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

248

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

344

2025.11.17

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

C# 教程
C# 教程

共94课时 | 7.7万人学习

Java 教程
Java 教程

共578课时 | 52万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号