深入理解Java虚拟机【十二】Java内存模型与线程【12.5】Java与协程

深入理解Java虚拟机【十二】Java内存模型与线程【12.5】Java与协程,第1张

深入理解Java虚拟机【十二】Java内存模型与线程【12.5】Java与协程 12.5 Java与协程(P461 ~ P465)

    协程即用户线程,因为用户线程早期大多被设计成通过协同式对之进行调度而被简称为“协程”,但如今已与调度方式无关。协程分有栈和无栈两种,有栈协程就如同当前每个Java线程都附有一个虚拟机栈般附有一个调用栈(类似虚拟机栈,如果Java成功引入了协程,那就是虚拟机栈),而无栈协程自然就没有。

12.5.1 内核线程的局限(P461 ~ P462)

    内核线程实现与如今“高并发”环境关系并不和谐。内核线程的最大缺陷在于消耗 *** 作系统内核资源,支持的内核线程数量有限,在过去并发量并不庞大的情况下尚可畅快运行,但如今却已渐露疲态。一方面动辄万级、十万级甚至百万级的并发量与过去完全不可同日而语,另一方面也因为分布式的兴起使得系统对微服务实时性要求更加苛刻,内核线程开始呈现独木难支的趋势。

12.5.2 协程的复苏(P462 ~ P463)

    内核线程是抢占式调度,调度成本十分高昂。内核线程消耗 *** 作系统内核资源的另一个体现在其调度方式,抢占式调度是通过 *** 作系统直接控制线程的状态转换,即所谓生命周期,这涉及数据的传输、复制、保护及保存等庞大且复杂的 *** 作,执行成本极其高昂。

    Java研究者试图将协程作为突破口。协程即用户线程,因为用户线程早期大多被设计成通过协同式对之进行调度而被简称为“协程”,但如今已与调度方式无关。协程分有栈和无栈两种,有栈协程就如同当前每个Java线程都附有一个虚拟机栈般附有一个调用栈(类似虚拟机栈,如果Java成功引入了协程,那就是虚拟机栈),而无栈协程自然就没有。协程(用户线程)的优点前面已经提及过,不消耗 *** 作系统内核资源,支持庞大的线程数量,这恰恰是Java当前最渴求的特性。而使用协程虽然依旧要对其生命周期进行管理,但因为解除了与 *** 作系统的耦合绑定,有太多的优化方案可使之轻量化。

    栈纠缠是一种模拟多线程的方式。文中提到了通过栈纠缠来模拟多线程,所谓模拟多线程不是真正意义上的多线程,其本质依旧是单线程。栈纠缠通过在内存中单独划出一块内存空间来模拟调用栈(类虚拟机栈),使线程以方法(函数)为单位来执行多个任务,从而形成多线程的假象。因为任务(一个任务一个栈)之间相互纠缠,因此被称为栈纠缠。

12.5.3 Java解决方案(P464 ~ P465)

    纤程是有栈协程的一种,更通俗的说是有栈用户线程的一种,是目前Java研究者试图引入协程的成果之一。

    对于目前Java线程实现的尴尬处境,目前的主流解决方案思想是引入协程(用户线程),这种引入近似于内核线程实现(1:1实现)向混合实现(N:M实现)的转变。之所以说近似,是因为混合实现中协程是内核线程通过轻量级进程来进行管控的,也就是说协程依旧由 *** 作系统来负责管理生命周期,即抢占式调度。但从12.5.2节中可知,Java研究者试图使协程保持一定的独立性,即不(完全)由 *** 作系统来负责其生命周期,而是有其专属的管理方式,故只是近似而非等同。

【上篇】《深入理解Java虚拟机【十二】Java内存模型与线程【12.4】Java与线程》
【下篇】《深入理解Java虚拟机【十二】Java内存模型与线程【12.6】本章小结》

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存