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异步编程实战》出版,我们也来跟大家聊聊异步编程的那些事儿。
你与世界
只差一个
公众号