什么原因使Java宁愿多线程也不选择协程

怎样选择多线程多进程和多协程? 有这么多可以实现并发的方式方法,那么,我们怎么确定在合适的时机采用合适的实现方法呢?这就需要我们对各个实现并发的方式方法有一个全面的概念性的理解,以及他们的内在执行逻辑优缺点有一个清晰的认识!如下图所示,首先我们需要对单进程、多进程、多线程及多协程之间有一个全局性的认识! 阅读详情

首先,我们要总结一下:协同进程是一个很有价值的概念,这将是多任务程序的发展方向。但 Java并没有太多的动机来推动这件事。

回到问题的根源。在我们要介绍的时候,我们要处理的问题是什么?我看无非是这样的:

节约,轻量化,具体来说:

节约内存,每一个执行绪都会有一个堆叠的记忆体,还有核心中的某些资源。

节省了分配线程的代价(每一次都要执行一次系统查询,每次都要执行一次)

节省大量线程切换带来的开销

与 NIO协作,以改善系统吞吐量

使用起来更舒适,更流畅(跑时不同步,写时不同步)

具体来说。

首先是记忆。以 Java Web编程为例,一个 tomcat上的 woker线程池的最大线程数通常会配置为50~500 (目前 springboot的默认值是200)。也就是说,一次只能接收这么多的要求。如果超出了上限,就会被拒绝。假设一个线程为128 KB,那么500个线程所需要的内存就是60多 MB。如果说有什么瓶颈的话,那就是 CPU, IO,带宽, DB等等,那么这一小部分的内存增长,就不算什么了。

上述讨论使 RSS与虚拟机之间的差异变得简单。事实上,当一个线程开始时,它所占用的空间和它的虚拟地址一样大。如果不是在现实中使用,它根本不会占用任何的物理记忆。

而在另一种情况下,比如说即时通讯系统,它要同时处理很多闲置的连接(动辄就是数十万、上百万)。在这种情况下,连接到线程是非常不合算的。但你可以简单地使用 netty来解决这些问题。你可以把 NIO+ wokerthread看作是一组“协程”,只是没有在文法层次上实现,而且书写的时候很难看。问题在于,您的方案是否真的涉及到成千上万、数百万个同时发生的连接?

让我们再来谈谈建立/破坏一个线程所带来的额外开销。在 Java中,使用线程池很好地解决了这个问题。您将会发现,即使您使用 Vert.x或 kotlin的协同程序,您最终还是要依靠线程池来完成任务。goroutine等于是在全球范围内建立了一个“线程池”,而 GOMAXPROCS就是一个最大的线程池;而 Java可以自由地设定多种不同的线程池(比如处理请求一套,异步任务另一套等)。kotlin使用这种方法来建立多种不同的协程范围。这样的话,就显得更有弹性了。

这样就会产生多个线程的交换开销。只有在“活跃”的时候,才会进行线程之间的转换。在网络环境下,由于 IO (Request-Request/Read DB),很多线程都处于被暂停状态,并没有参与操作系统的线程切换。实际上,一台最多200个线程的服务器,同时也只有几十个“活跃线程”。花费并不多。要防止太多的线程交换,需要注意的是,在同一时间内,存在许多“活跃线程”。这一点,我以前在学校的时候,也做过一次。每个结点,每个连结都有一个线程来执行。当模拟开始运行的时候,就有数千个活跃的线程。然后,系统就被卡住了,然后被杀了。

还有就是和 NIO合作的事情。Java的 NIO/Netty/Vert. X/rx Java/Akka都是一个不错的选择。通常情况下,由于 IO的延迟,网蒂就能解决大部分的资源浪费问题。Vert.X/rxJava。可以让程序写的更加“优雅”一点(见仁见智)。Akka就是Java世界里对“原教旨OO“的实现,别具一格。诚然,使用 NIO+完成未来/处理器/lambda并没有像使用 async+ await那样轻松,但至少还能工作。

如果 Java的 NIO确实被用在了业务上,那么 JDBC就是它的核心痛点。这是一个已经存在了数十年的数据库交互协议,它需要用到块 IO。它承载着大量的 Java生态和商业逻辑。Java想要改变它的编程方法,就需要对 JDBC进行重新设计和实现。执行以下操作:https://github.com/vert-x3/vertx-mysql-postgresql-客户机。问题在于,在这个社区中,这样的“异步 JDBC”并不能提供对 Oracle, SQL服务器之类的传统数据库的支持。Mysql和 Postgres这两个选项,还得再加一把火。

如果你仔细地读一读以上那些要求用“协程”来处理的问题,你将会看到,它们可以用不同的方法来处理。如果你认为线程费了很大的力气,你就可以对线程量进行控制,你就可以对线程堆栈进行缩小,你就可以使用线程池来配置最大值和最大值。要使用 go通道,可以使用 disruptor。在 Java的生态中,虽然没有“协程”这样的一级概念,但却有很多工具可以用来解决这些问题。

Java只是不能解决“协同进程“的定义和“优美的书写”的问题。从工程学的观点来看,“写得优雅”的好处并不像许多追求新鲜感的人所认为的那样重要。C#并不是因为它的 ASync await,就把 Java从市场上抢走了。反之,如果 java社区竭尽所能地推动这一点,那么随着协同进程的到来, Java的历史将会发生巨大的变化。想象没有线程和线程局部,@Transactional不起作用了,而且也找不到合适的替代品,你会不会感到沮丧?不管怎么说,这都是一笔不划算的买卖。我不认为甲骨文会对这件事感兴趣。如果有那么多 Java程序员愿意用 OpenJDK,我都不知道该说什么好了。就我所知道的,到了现在,在9012年,仍然有很多Java6的程序员。

而其它一些新语言则没有那么多的历史负担,并且更易于反思“怎样才是多任务编程的现代方法”。kotlin的协程函数, go的 goroutine, JavaScript的同态函数, python的同态函数,以及 Swift的 GCD,都给出了相应的解决方案。如果你真的希望在 Java系统中使用“协程”,那么你可以先从 kotlin入手,因为它是可以进行混合编程的。

多线程之所以会出现 BUG,是因为:

“优先级”的线程切换,你不能决定两个线程的数据访问顺序,完全是随机性的。

“Sync”无法组合,即使组合在一起,也无法组合在一起。

协同程序是否能够避开 BUG,很大程度上取决于能否避开以上两点。如果协同进程的底层使用的是线程池,两个协同进程使用的是共享内存,那么多线程出现的 bug,也会出现在协同进程中。javascript中之所以没有出现这样的 bug,是因为它只有一个用户线程,没有线程之间的转换和同步。“go”是一种用频道制作“goroutine”的电子简报。如果不使用通道,而使用共享的变量,而且不使用同步包进行控制,仍然会出现 bug。

a15fe564e5744316b21291e17b800e95.jpg

 

SOI技术实战:从晶圆结构到芯片性能提升的完整解析 本文深入解析SOI(Silicon on Insulator)技术如何通过独特的三明治晶圆结构提升芯片性能,涵盖从220nm SOI层设计到7nm节点的工艺挑战。详细探讨了埋氧层的绝缘优势、性能提升的物理机制,以及AMD处理器和5G射频中的实战应用,为半导体行业提供关键技术洞见。 阅读详情

相关推荐

网卡Inter (R) Wi-Fi 6 AX201突然故障 错误代码10,无法找到无线网络,蓝牙也无效了

问题描述 说来也是坑,简直就莫名其妙。早上在工位上,电脑一切正常(一直用的是无线网络),然后周五准备开周会了,所以拔掉电脑外接设备(电源线,鼠标,外接显示器)拿起电脑到会议室。到了会议室之后,无线网断开了(但一般是不会断开的,都在公司范围内),所以选择重连,但发现已经没有无线网络列表了。 电脑机型:联想YOGA 14s 2021 初步尝试 1、关闭开始飞行模式 - 无果 2、重启并重启 (因为前两天已经提醒过有windows更新,趁这个机会就更新并重启了)- 无果 3、下载鲁大师、驱动精灵、联想驱动管

疯狂的蜗牛 5万+

一文带你彻底了解Java异步

随着RxJava、Reactor等异步框架的流行,异步编程受到了越来越多的关注,尤其是在IO密集型的业务场景中,相比传统的同步开发模式,异步编程的优势越来越明显。 那到底什么是异步编程?异步化真正的好处又是什么?如何选择适合自己团队的异步技术?在实施异步框架落地的过程中有哪些需要注意的地方? 本文从以下几个方面结合真实项目异步改造经验对异步编程进行分析,希望能给大家一些客观认识: 使用RxJava异步改造后的效果 什么是异步编程?异步实现原理 异步技术选型参考 异步化真正的好处是什么? 异步化落地的难点及

zxs0564335的博客 1740

让AI稳定生成流程图:基于Skill与Mermaid的工程化实践

流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图

weixin_42548782的博客 313

为什么 Java 坚持多线程不选择协程?

近二十年来,软件行业的增长主要得益于网络编程,而网络编程中最常见的模型是客户端/服务器模式(C/S)。这种编程模型要求服务器端能够同时接受客户端的请求,这就需要具备良好的并发特性,而多线程正是实现这一特性的主要手段。其次,社区项目也在推动协程的发展。在 Java 中,多线程的应用广泛,而协程的使用则相对较少。此外,Java 类库如今非常丰富,提供了多种解决异步编程复杂性的手段,协程可能并不是首选。最后,需要指出的是,当前常见的“协程”技术在底层实际上仍然依赖多线程。在服务器端编程领域占据着重要地位。

T1246632660的博客 466

力扣(Leetcode)第1题:两数之和(C语言版本)

题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6

qq_39855356的博客 3325

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5872

java 协程 没有必要_【深度探讨】为什么 Java 坚持多线程,而不选择协程呢?

问题的本源当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线程要各做一次 syscall)节省大量线程切换带来的开销与 NIO 配合实现非阻塞的编程,提高系统的吞吐使用起来更加舒服顺畅(async+await,跑起来是异步的,但写起来感觉上是同步的)我们分开来讲下。先说内存...

weixin_34647584的博客 258

STM32学习笔记(江协科技)-----OLED显示屏

SSD1306简介:•SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务••驱动接口:128个SEG引脚和64个COM引脚,对应128*64像素点阵显示屏••内置显示存储器(GDDRAM):128*64 bit128*8 ByteSRAM••供电:IC逻辑),VCC=7~15V(面板驱动)••通信接口:8位6800/8080并行接口,3/4线SPI。

lu322f的博客 1063

java协程_什么是协程?Java中如何支持?

协程(Coroutine):是单线程下的并发,又称微线程,纤程。简单理解就是线程中的线程。优点:轻量,创建成本小,降低了内存消耗用户态调度,减少了 CPU 上下文切换的开销,提高了 CPU 缓存命中率减少同步加锁,提高了性能可以用同步思维写异步代码缺点:在协程执行中不能有阻塞操作,否则整个线程被阻塞不擅长处理 CPU密集型适用场景:高性能要求,考虑牺牲公平性换取吞吐量IO 密集型任务Genera...

weixin_35589806的博客 2725

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 322

【CAN总线测试】——使用VH6501 进行Busoff快慢恢复测试

即在IDBase中填标准帧11位二进制ID,如果不满11位,高位补零,凑齐11位,并将下方CurrTriggerField设置干扰前一位AckSlot位,Triggeroffset设置为0。首先确认环境支持VN6501,6501硬件连接成功后,工程的小闪电是正常黄色状态,若是灰色证明缺少License,或者软件安装环境不正确。填写干扰报文ID、干扰位置 注意这里的干扰位置是实际干扰的前一位,TriggerOffset表示偏移量,可以干扰某个字节的具体位.找到并打开Panel后,开启工程,并且配置面板。

LOVE135149的博客 5634

多线程是JAVA绕不去的坎,为什么坚持多线程不选择协程呢?让我来告诉你原因:。。。。。。。

前言: 发现面试时多线程是Java绕不去的坎,就有几个问题: 1.为什么多线程在Java中这么重要 2.据说多线程会出现难以排查的BUG,那么使用协程的话能否避免这些BUG呢 3.go的协程是可以跑满整个核心的,但Java是不是除非从语言底层改造,否则做不到这一点 4.Kotlin支持协程,是否用起来比多线程好呢 所以,学好Java中的多线程是否还有必要呢? 欢迎各位大佬进群共同交流学习,我们的交流分享群:1149778920 暗号:优快云 博主在这里给大家整理了包括但不限于:JAVA基础和进阶类、

S11035762的博客 432

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2881

你怕是对多线程有什么误解,详解JAVA并发的重要性,这就是JAVA这么多年都不使用协程的原因!

前言: 发现面试时多线程是Java绕不去的坎,就有几个问题: 1.为什么多线程在Java中这么重要 2.据说多线程会出现难以排查的BUG,那么使用协程的话能否避免这些BUG呢 3.go的协程是可以跑满整个核心的,但Java是不是除非从语言底层改造,否则做不到这一点 4.Kotlin支持协程,是否用起来比多线程好呢 所以,学好Java中的多线程是否还有必要呢? 欢迎各位大佬进群共同交流学习,我们的交流分享群:1149778920 暗号:优快云 博主在这里给大家整理了包括但不限于:JAVA基础和进阶类、

Spring boot 3504

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 协程 没有必要_为什么 Java 坚持多线程不选择协程?

前言:这个是我一个粉丝问我的问题,一个刚从python转Java的粉丝朋友。特此拿出来分享一下。希望能对大家在这块有迷惑的有所帮助。以下是他的问题面试时多线程是Java绕不去的坎,就有几个问题1.为什么多线程在Java中这么重要?2.据说多线程会出现难以排查的BUG,那么使用协程的话能否避免这些BUG呢?3.go的协程是可以跑满整个核心的,但Java是不是除非从语言底层改造,否则做不到这一点?4....

weixin_39777404的博客 517

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java 协程_为什么 Java 坚持多线程不选择协程?

前言:这个是我一个粉丝问我的问题,一个刚从python转Java的粉丝朋友。特此拿出来分享一下。希望能对大家在这块有迷惑的有所帮助。以下是他的问题面试时多线程是Java绕不去的坎,就有几个问题1.为什么多线程在Java中这么重要?2.据说多线程会出现难以排查的BUG,那么使用协程的话能否避免这些BUG呢?3.go的协程是可以跑满整个核心的,但Java是不是除非从语言底层改造,否则做不到这一点?4....

weixin_39649736的博客 97

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java协程_为什么 Java 坚持多线程不选择协程?

谢邀。先说结论:协程是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。先返回到问题的本源。当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线程要各做一次syscall)节省大量线程切换带来的开销与NIO配合实现非阻塞的编程,提高系统的吞吐...

weixin_36370242的博客 619

java 协程 scala_为什么 Java 坚持多线程不选择协程?

谢邀。先说结论:协程是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。先返回到问题的本源。当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线程要各做一次syscall)节省大量线程切换带来的开销与NIO配合实现非阻塞的编程,提高系统的吞吐...

weixin_35323111的博客 252

Java编程:Java里的协程

今天看到这篇博客记录一下,后面有时间来研究一下协程看能不能对现在的项目有所提高 转https://blog.youkuaiyun.com/zdy0_2004/article/details/51323583?utm_source=blogxgwz0 这东西其实有很多名词,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实最直观的解释可以定义为线程的线程。有点拗口,但本质上就...

天空之蓝的博客 2万+

java开发多线程重要嘛_为什么 Java 坚持多线程不选择协程?

我来分别回答题主的问题1.为什么多线程在Java中这么重要从java被发明的第一天起,就被定义为一个多线程的网络编程语言。Java最大特点并不是跨平台,而是它的多线程模型(那时候的C++中,并没有我们现在看到的thread,C#还没有出来)。因为近二十年的软件行业的增长主要来自网络编程,网络编程最常见的模型就是client/server, 也就是所谓的C/S,这种编程模型在服务器端需要同时接受客户...

weixin_28869849的博客 620

单线程、多线程和协程的爬虫性能对比

作者:小小明 非常擅长解决各类复杂数据处理的逻辑,各类结构化与非结构化数据互转,字符串解析匹配等等。 至今已经帮助百名以上数据从业者解决工作中的实际问题,如果你在数据处理上遇到什么困难,欢迎与我交流。 豆瓣深圳影讯爬虫 文章目录豆瓣深圳影讯爬虫爬取测试单线程爬虫多线程爬虫协程异步爬虫回顾 各位读者们大家好,我是小小明。今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程、多线程和协程来爬取,从而对比单线程、多线程和协程在网络爬虫中的性能。 具体要爬的网址是:https:/.

小小明-代码实体的专栏 7万+

【深度探讨】为什么 Java 坚持多线程,而不选择协程呢?

问题的本源当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线...

qq_18244417的博客 477

postgres 支持的线程数_为什么 Java 坚持多线程不选择协程?

先说结论:协程是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。先返回到问题的本源。当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线程要各做一次syscall)节省大量线程切换带来的开销与NIO配合实现非阻塞的编程,提高系统的...

weixin_39640008的博客 150

java 协程线程的区别_为什么 Java 坚持多线程不选择协程?

谢邀。先说结论:协程是非常值得学习的概念,它是多任务编程的未来。但是Java全力推进这个事情的动力并不大。先返回到问题的本源。当我们希望引入协程,我们想解决什么问题。我想不外乎下面几点:节省资源,轻量,具体就是:节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源节省分配线程的开销(创建和销毁线程要各做一次syscall)节省大量线程切换带来的开销与NIO配合实现非阻塞的编程,提高系统的吞吐...

weixin_39631572的博客 154
下一篇: java程序员需要掌握哪些技术
昊言likeJava
博客等级 码龄3年 3489粉丝 376原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值