当前位置: 首页 > news >正文

Java异步编程并没有广泛使用起来,这是什么原因? (文末有福利)


作者:caison

谈到异步编程,首先需要理解,计算机领域中的同步操作(Synchronous)和异步操作(Asynchronous)的含义。

同步操作:意味着事件同时存在,同时发生,在操作处理期间,发起方需要一直阻塞等到完成,在此期间不能做其他事情。

异步操作:意味着事件不是同时存在,在操作处理期间,发起方不需要一直阻塞等到完成,在此期间可以做其他事情。

举个例子:产品经理给开发人员提供需求,开发人员去写代码实现,在这过程中,产品经理一直站在开发人员的身后盯着开发完成工作,直到开发人员写完代码,这是同步的;产品经理告诉开发人员需求,转而去做别的事情,当开发人员完成时,只需要通知产品经理结果,这是异步的。

大部分系统开发的编程模型是基于同步的,可是当遇到了系统需要大量阻塞等待的场景,同步编程的问题就开始显现:最典型的场景是I/O,同步操作的I/O意味着线程发起I/O读写请求后,线程必须阻塞等待直到操作完成,当应用系统有大量的I/O操作,例如文件读写、网络请求收发,同步编程的系统实现并发执行这些I/O事件则每个事件,需要每个操作由独立的线程处理,需要创建大量的线程,容易导致系统性能瓶颈。

针对同步编程需要阻塞等待的问题,异步编程提供了解决方案,即在操作处理期间线程去做别的事情,操作完成后再进行通知。实现这套机制最常见的是基于观察者模式,即通知-订阅的方式,线程提前将异步操作完成后的回调处理逻辑注册保存到指定集合中,发起一个异步操作后,去处理其他业务,当操作处理完成后,只要在集合中找到回调逻辑逻辑进行执行即可。

异步编程带来的优势很明显,再也不用创建大量线程处理阻塞操作,性能大大提升,但是在普通业务开发系统中,异步并没有广泛使用起来,这是什么原因?

首先,普通系统没有大量并发请求,还没有达到性能瓶颈,普通的线程阻塞等待能处理得过来。

其次,异步程序编写比较复杂,对开发者的能力有一定要求,传统的同步程序,执行A、B、C这3步操作只要3行代码函数调用,程序就会按照代码编写顺序进行同步执行;而异步是需要注册A、B、C这3步操作的后续处理回调逻辑,当操作存在顺序则需要进行嵌套,即A的回调逻辑是执行B操作,B操作的回调是执行C,一层层嵌套,最后形成嵌套地狱。

最后,异步程序调试比较麻烦,新增的回调机制导致debug起来没有同步编程那么直观。

针对上面问题,业界提供了一些解决方案,例如Java的Future可用于提交任务给线程池,基于Future可以拿到异步执行结果;高性能网络框架Netty基本统治了异步网络编程领域;WebFlux对Netty的能力再进行封装,使得能用更优雅简洁的代码完成业务系统的开发,还有go语言的异军突起在容器、高并发服务器领域大放异彩。

异步编程可以说是进阶Java高级工程师的必须掌握的知识,业界这块的资料比较少,最近刚好新出了淘宝资深研发工程师翟陆续写的《Java异步编程实战》,深入剖析Java、go语言异步编程能力,系统讲解各种Java开发框架、异步编程框架、中间件异步编程原理,值得学习。

《Java异步编程实战》

这是一部全面解析Java异步编程的著作,针对各种常见异步编程场景,从编程语言、开发框架等角度深入讲解了异步编程的原理和方法。作者是淘宝的资深Java技术工程师,在Java异步编程、并发编程领域有深厚的积累。

文末福利,免费送50本!!!

Java异步编程带来的优势很明显,再也不用创建大量线程处理阻塞操作,性能大大提升,但是在普通业务开发系统中,异步并没有广泛使用起来,这是什么原因?

此次,趁着国内首本异步编程著作《Java异步编程实战》出版,我们也来跟大家聊聊异步编程的那些事儿。

你与世界

只差一个

公众号

相关文章:

  • 新书推荐 | Java核心技术 卷II 高级特性(原书第11版)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • 中台四杰与阿里往事
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • InfoQ 编辑部开年聊聊 2020 年值得关注的十大技术趋势
  • 达摩院十大科技趋势发布:2020 非同小可!
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • 新书推荐 | 深入浅出图神经网络:GNN原理解析
  • 新书推荐 | 现代机器人学:机构、规划与控制
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • 什么是机器学习?有哪些应用?终于有人讲明白了
  • TIOBE 1 月编程语言排行榜:C 语言再度「C 位」出道!
  • 新书推荐 | 数据流机器学习:MOA实例
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • 2020大风口!什么是图神经网络?有什么用?终于有人讲明白了
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • DataBase in Android
  • docker容器内的网络抓包
  • git 常用命令
  • Java方法详解
  • Logstash 参考指南(目录)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql 5.6 原生Online DDL解析
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Node 版本管理
  • Spring Cloud Feign的两种使用姿势
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 仿天猫超市收藏抛物线动画工具库
  • 分类模型——Logistics Regression
  • 解析带emoji和链接的聊天系统消息
  • 前端技术周刊 2019-01-14:客户端存储
  • 设计模式走一遍---观察者模式
  • 一个JAVA程序员成长之路分享
  • postgresql行列转换函数
  • ​学习一下,什么是预包装食品?​
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Ubuntu(修改root信息)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (3)llvm ir转换过程
  • (bean配置类的注解开发)学习Spring的第十三天
  • (pojstep1.1.2)2654(直叙式模拟)
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)模仿学习-Action数据的模仿
  • (算法)N皇后问题
  • (正则)提取页面里的img标签
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转载)从 Java 代码到 Java 堆
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net接口调试与案例