Java将增加虚拟线程,挑战Go协程
我们知道 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. 编程宝库
Java将增加虚拟线程,挑战Go协程的更多相关文章
- Java SE 19 虚拟线程
Java SE 19 虚拟线程 作者:Grey 原文地址: 博客园:Java SE 19 虚拟线程 CSDN:Java SE 19 虚拟线程 说明 虚拟线程(Virtual Threads)是在Pro ...
- python 38 线程队列与协程
目录 1. 线程队列 1.1 先进先出(FIFO) 1.2 后进先出(LIFO)堆栈 1.3 优先级队列 2. 事件event 3. 协程 4. Greenlet 模块 5. Gevent模块 1. ...
- 并发编程 --进、线程池、协程、IO模型
内容目录: 1.socket服务端实现并发 2.进程池,线程池 3.协程 4.IO模型 1.socket服务端实现并发 # 客户端: import socket client = socket.soc ...
- based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较 gevent不是异步 协程原理 占位符 placeholder (Future, Promise, Deferred) 循环引擎 greenlet 没有显式调度的微线程,换言之 协程
gevent GitHub - gevent/gevent: Coroutine-based concurrency library for Python https://github.com/gev ...
- 协程 & 用户级(内核级)线程 & 切换开销 & 协程与异步回调的差异
今天先是看到多线程级别的内容,然后又看到协程的内容. 基本的领会是,协程是对异步回调方式的一种变换,同样是在一个线程内,协程通过主动放弃时间片交由其他协程执行来协作,故名协程. 而协程很早就有了,那时 ...
- concurrent.futures进线程池和协程
concurrent.futures 异步执行进程线程池的模块,一个抽象类,定义submit,map,shutdown方法 from concurrent.futures import Process ...
- Python 37 进程池与线程池 、 协程
一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- python day 20: 线程池与协程,多进程TCP服务器
目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...
随机推荐
- mysql数据备份及恢复详细操作
一.数据库数据备份 1.全备 BakDir=/backup/full #创建全备目录 LogFile=/backup/full/bak.log #创建备份日志 Date=`date +%Y%m%d` ...
- 如何通过 Serverless 技术降低微服务应用资源成本?
前言 在大型分布式 IT 架构领域,微服务是一项必不可少的技术.从本质上来讲,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通信机制进行通信.这些应用都是 ...
- .Net Core 获取上下文HttpContext
1.先定义一个类 using Microsoft.AspNetCore.Http; namespace BCode.Util { public class MvcContext { public st ...
- 题解 Hero meet devil
题目传送门 题目大意 给出一个长度为 \(n\) 的字符串,对于每个 \(k\in [0,n]\),求出有多少个长度为 \(m\) 的字符串满足两者最长公共子序列长度为 \(k\). \(n\le 1 ...
- Oracle12C安装教程
准备工作 网盘链接: https://pan.baidu.com/s/1gffHbOjImk1SfezdWO2Bpw 提取码: imft Oracle12C的安装 1.分别解压"winx64 ...
- Excel一对多查找
很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找方法 ...
- 请问:c语言中d=1/3*3.0;与d=1.0/3*3;d=?有什么区别
请问:c语言中d=1/33.0;与d=1.0/33;d=?有什么区别 d=1/33.0; 这时d=0,d=(1/3)3.0,这里1是整形,1/3也是整形,等于0,所以03.0=0 d=1.0/33; ...
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- Linux入门所必备的Linux命令和C语言基础
文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...
- 我的一些JAVA基础见解
这个学期学习JAVA基础课,虽说之前都自学过,但在学习时仍可以思考一些模糊不清的问题,可以更深一步的思考.在这里写下一些需要深入的知识点,对小白们也很友好~ 一.Java数据类型 1.基本数据类型 这 ...