当前位置: 首页 > 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大风口!什么是图神经网络?有什么用?终于有人讲明白了
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【个人向】《HTTP图解》阅后小结
  • 30天自制操作系统-2
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES10 特性的完整指南
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascript编码规范
  • JavaScript服务器推送技术之 WebSocket
  • Markdown 语法简单说明
  • PAT A1017 优先队列
  • 对JS继承的一点思考
  • 欢迎参加第二届中国游戏开发者大会
  • 京东美团研发面经
  • 离散点最小(凸)包围边界查找
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider采集配置界面介绍
  • 我这样减少了26.5M Java内存!
  • 一个JAVA程序员成长之路分享
  • 译自由幺半群
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​虚拟化系列介绍(十)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #13 yum、编译安装与sed命令的使用
  • #WEB前端(HTML属性)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2)nginx 安装、启停
  • (C语言)fread与fwrite详解
  • (vue)页面文件上传获取:action地址
  • (第一天)包装对象、作用域、创建对象
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (利用IDEA+Maven)定制属于自己的jar包
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (篇九)MySQL常用内置函数
  • (三分钟)速览传统边缘检测算子
  • (一一四)第九章编程练习
  • (正则)提取页面里的img标签
  • .gitignore文件---让git自动忽略指定文件
  • .NET : 在VS2008中计算代码度量值