资讯专栏INFORMATION COLUMN

Java将增加虚拟线程,挑战Go协程

why_rookie / 2771人阅读

摘要:本周提交的一份增强建议草案要求将虚拟线程作为标准版的一部分进行预览。虚拟线程目的是更好地支持编写和维护高吞吐量并发应用程序。该提案指出,使用虚拟线程不需要学习新的编程模型。

我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制。一个 go 语句就可以发起一个协程 (goroutin)。
协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是由用户程序自行管理和调度。它寄存于线程中,系统开销极小,可以显著的提高性能和并发能力。使用协程的优点是运行效率高、编程简单、结构清晰。目前,原生支持协程的语言不是很多。

Oracle 本周提交的一份JDK增强建议(JEP)草案要求将虚拟线程作为Java标准版的一部分进行预览。
虚拟线程类似于 Go 语言的协程,将补充Java的平台线程(代表操作系统线程),采用轻量级的用户模式线程实现,将更有效地利用可用的硬件,并大大降低成本。
虚拟线程目的是更好地支持编写和维护高吞吐量并发应用程序。

该提案指出,线程对于代表一个并发单元(如事务)是很有用的。Java目前对Thread的实现是为每个Java线程消耗一个操作系统线程,而操作系统线程是稀缺和昂贵的。现代服务器的能力可以处理比操作系统线程更多数量级的并发事务。

编写高吞吐量服务器软件的开发者不得不在事务之间共享线程,以有效利用硬件。这是用线程池来完成的,它将线程借给一个又一个事务,以节省为每个事务创建线程的成本。当这还不够时,开发人员开始将线程返回到线程池中,甚至在事务的中间,在等待I/O的时候。但是,这导致了一种异步的编程风格,需要一套独立的、不兼容的API,并使故障排除、调试、观察和分析变得非常困难。


虚拟线程是java.lang.Thread的用户模式实现,它不会阻塞操作系统线程,能够实现接近最佳的硬件利用率。虚拟线程允许高水平的并发,以及高吞吐量,同时程序仍然与Java平台和工具的基于线程的设计相协调。虚拟线程对于平台线程来说,就像虚拟内存对于物理RAM一样:一种通过自动映射到底层物理资源而提供丰富的 "虚拟 "资源的机制。

该提案指出,使用虚拟线程不需要学习新的编程模型。使用Java编写并发应用程序的开发者已经知道这个模型。然而,开发人员需要改变由于线程的高成本而产生的旧习惯,特别是使用线程池,这些线程池只有在它们所汇集的资源稀缺或创建成本高昂时才有用。

虚拟线程是由JDK实现的java.lang.Thread的实例,它允许许多活动实例在同一进程中共存。虚拟线程的语义与平台线程相同,只是它们属于单一的ThreadGroup,不能被枚举。

 

参考资料:

1. 进程、线程和协程的区别

2. 编程宝库

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123994.html

相关文章

  • 三年半Java后端面试经历

    摘要:经过半年的沉淀,加上对,和分布式这块的补齐,终于开始重拾面试信心,再次出征。面试官提示没有提到线程的有内核态的切换,程只在用户态调度。三面综合技术面这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,导致面试的节奏有点乱。 经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征。 鹅厂 面试职位:go后端开发工程师,接受从Jav...

    kviccn 评论0 收藏0
  • Java并发编程的艺术】第一章读书笔记

    摘要:前言并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。尽可能降低上下文切换的次数,有助于提高并发效率。死锁并发编程中的另一挑战是死锁,会造成系统功能不可用。 前言 并发编程的目的是让程序跑的更快,但并不是启动更多的线程,这个程序就跑的更快。有以下几种挑战。 挑战及方案 上下文切换 单核CPU上执行多线程任务,通过给每个线程分配CPU时间片的方式来实现这个机制。...

    马忠志 评论0 收藏0
  • 实时联网游戏后台服务技术选型与挑战(网络接入篇)

    摘要:概述本系列文章将从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。多路复用避免了读写阻塞,减少了上下文切换,提升了利用率和系统吞吐率。 概述:本系列文章将从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。 关...

    zhisheng 评论0 收藏0
  • Go语言学习】2019-04-24 协程初步讨论与简单扩展

    摘要:它避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂。而可以理解为一种语言的协程。线程轻量级进程,,是程序执行流的最小单元。一个标准的线程由线程,当前指令指针,寄存器集合和堆栈组成。其实就是或者等语言中的多线程开发。 grape 全部视频:https://segmentfault.com/a/11... 原视频地址:https://biglive.xueersi.c...

    SnaiLiu 评论0 收藏0
  • Java线程学习(七)并发编程中一些问题

    摘要:因为多线程竞争锁时会引起上下文切换。减少线程的使用。举个例子如果说服务器的带宽只有,某个资源的下载速度是,系统启动个线程下载该资源并不会导致下载速度编程,所以在并发编程时,需要考虑这些资源的限制。 最近私下做一项目,一bug几日未解决,总惶恐。一日顿悟,bug不可怕,怕的是项目不存在bug,与其惧怕,何不与其刚正面。 系列文章传送门: Java多线程学习(一)Java多线程入门 Jav...

    yimo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<