Java异步编程实战经典读后感有感

  《Java异步编程实战》是一本由翟陆续著作,机械工业出版社出版的平装图书,本书定价:79,页数:284,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助。

  《Java异步编程实战》读后感(一):我与《Java异步编程实战》的故事

  我是一名程序员,过着996的生活。

  但我创造了一个世界,这个世界很忙碌,每天不停地运转,在这个世界里,我是它们的造物者,掌管着所有人的生杀大权。

  这个世界由多个部门组成,为了使这个世界有条不紊地运转,我费了很多功夫,还需要定时地检查运转情况,比如谁偷懒了,谁累趴了等等。

  这个世界都是同步执行的,看似平静,但随着外面世界的变化,这种平静慢慢地被打破了。

  首当其冲的是我们的网络驿站,主管部门是网络通信部,它负责处理外部给他的包裹,并按照包裹内的指示作出回应,最近给他投递包裹的人越来越多,线程工厂那边搬运完包裹,交给数据库管理员后,就静静地喝茶看报,等待结果,数据库满头大汗地跑来跑去,好不容易凑足了数据,刚交给线程厂的小伙子,下一个包裹又来了,马不停蹄也做不完,主子又不肯加人手,干脆不干了……

  原来这个世界是虚拟的电商系统。

  程序员察觉到异常,开始盘查这个世界的运作情况,他发现线程厂的小伙子们总是特别闲,成天到晚喝茶、游手好闲,便叫了线程厂厂长来训话,厂长也是一脸委屈,这不能怪我啊,我们都是在等数据库工厂那边,他们太慢啦,又不让我们干别的事,只能等啦。

  程序员又把网络驿站的站长叫来,站长也是相当无奈,我们就只有那么多服务窗口啊,线程厂那边没响应数据给我们,我们就只有等啦,排队的人多了,怕引起踩践事故,后面就不让人进来了。

  程序员开始陷入了沉思,这个世界的运作规则,可能要改一改了。

  从线程工厂那边开始整改,因为就他最闲。

  经过一番试验,给线程厂制定了新的工作规则:新招了一个叫Future的员工,线程小伙子把包裹数据给了数据库后,就可以把工作任务交给Future了,小伙子们去拿下一个包裹,由Future负责接收数据库的结果。

  新的规则生效后,线程厂的小伙子们,喝茶看报的日子少了,忙的时候,额头也开始冒汗了,程序员对这个结果露出了一丝微笑。

  平静的日子持续了一段时间,外面的人对这个世界更感兴趣了,交流也逐渐变多了,各部门要开始忙碌起来了,偶尔向程序员吐槽吐槽人手不够的问题,看来还需要进一步提高效率才行。

  这次没上回那么紧迫,可以对所有部门好好梳理梳理。

  各部门呈报上来的整改方案:

  1. Controller小组反馈:外部给我们的包裹指示,有部分工作的结果是不需要响应给外部的,但我们也在等他们处理的结果,要求这部分异步化处理。

  2. Servlet小组反馈:我们提供的IO是阻塞式的,没有人手处理时,会造成外部卡顿,要求改成非阻塞IO。

  程序员找来《Java异步编程实战》,开始新的一轮重构...

  《Java异步编程实战》读后感(二):我与Java异步编程的小美好

  当初大学义无反顾走上Java道路,就是觉得Java很有意思,记得刚工作那会,整天比较多的都是写简单的增删改查,在我动力日渐消散的时候,头儿给的很多学习文档我还没看完,头儿又说:“Java光会简单的添删改查什么的不行,要深入了解,多去看看Java高级编程,比起异步编程,高并发多线程,JUC等等。”至此,走上了异步编程的研究之路和着迷之路。

  Java在Java8之前貌似还没真正实现异步编程的方法。后来Java8借鉴了很多框架的思想,可以借助JDK原生的CompletableFuture来实现异步操作,而且用Lambda表达式来写匿名内部类大大简化了代码量。当时异步编程会使用回调或者使用其他的框架(如Netty和Guava)来实现。Java 开始方法执行到结束,都是由同一个线程完成的。这种方式虽易于开发调试,但容易因为锁、IO 等原因导致线程挂起,产生线程上下文切换。随着对应用并发能力要求越来越高,频繁的线程上下文切换所带来的成本变得难以忽视。同时,线程也是相对宝贵的资源,无限制的增加线程是不可能的。

  异步编程技术目的,重点并非提高并发能力,而是提高伸缩性 (Scalability)。现在的 Web 服务,应付 QPS 几百上千,甚至上万的场景并没有太大问题,但问题是如何在并发请求量突增的场景中提供稳定服务呢?如果一个应用能稳定提供 QPS 1000的服务。假如在某一个大促活动中,这个应用的 QPS 突然增加到10000怎么办?或者 QPS 没变,但这个应用所依赖的服务发生故障,或网络超时。当这些情况发生时,服务还能稳定提供吗?虽然熔断、限流等技术能够解决这种场景下服务的可用性问题,但这毕竟是一种舍车保帅的做法。是否能在流量突增时仍保证服务质量呢?答案是肯定的,那就是异步编程 + NIO。NIO 技术本身现在已经很成熟了,关键是用一种什么样的异步编程技术将 NIO 落地到系统,尤其是业务快速迭代的前台、中台系统中。

  很多时候我们都希望能够最大的利用资源,比如在进行IO操作的时候尽可能的避免同步阻塞的等待,因为这会浪费CPU的资源。如果在有可读的数据的时候能够通知程序执行读操作甚至由操作系统内核帮助我们完成数据的拷贝,这再好不过了。从NIO到CompletableFuture、Lambda、Fork/Join,java一直在努力让程序尽可能变的异步甚至拥有更高的并行度,这一点一些函数式语言做的比较好,因此java也或多或少的借鉴了某些特性。

  在我们的实际项目中,需要多用Java异步编程,来提高性能。需要注意并行的工作单元的切分,以及注意有没有共享变量的使用。如果有不合理的地方,大家多指正。在Java7之前,Java中对于异步编程的实现都可能比较复杂或者实现得不够优雅,而CompletableFuture的出现则提供了异步编程的强大能力,虽然API有点多但是只要稍加理解和使用还是很好应用的,通过链式调用使原本通过回调的方式变得更加优雅,代码的可阅读性和可维护性也得到一定的提高。最近一直在学习大佬的博客,最后也给大家推荐一本此大佬的书籍,跟着大佬就是进步速度快!一起努力成为更美好的自己吧!

  《Java异步编程实战》读后感(三):进阶Java高级工程师 必须理解的异步编程

  谈到异步编程,首先需要理解,计算机领域中的同步操作(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异步编程实战》读后感(四):推荐推荐推荐,重要的事情说三遍

  这个世界的运转就是异步的,因此异步编程变得越来越重要。我们在最开始学习编程的时候都是编写同步的代码,随着学习的深入,为了提高系统性能,就会使用异步编程来处理一些任务,从而提高系统的吞吐率。但是异步编程会产生一些新的问题,比如如何监控异步线程的状态,如何处理错误,如何管理大量的线程,这些问题都使我意识到必须要深入地学习异步编程。

  异步编程可以很好的平衡IO密集型任务和CPU密集型任务之间的分工合作。充分利用计算机CPU资源,不让CPU阻塞在某个长时间运行的任务上,提高CPU运行的吞吐率。如果不使用多线程异步编程,我们的系统就会阻塞在耗时的任务上,十分浪费计算资源。Java 语言对异步编程提供了良好的支持。特别是在Java 8中,对异步编程进行了很大的改进。Java 8 可以算是 Java 中一个里程碑版本,添加许多让人惊叹的新的特性,其提供了丰富的API,来完成多线程异步编程,例如NIO、Future、CompletableFuture、Fork/Join以及parrallelStream。除此之外guava和Spring等框架都提供了相关支持来简化异步编程。

  我最开始接触异步编程是在学习Netty的时候,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。慢慢地我对异步编程有了一些了解,也开始慢慢深入学习,对于异步编程,使用起来大大地提高了效率,也在学习过程中收获了许多。但是由于缺乏这方面的资料,在学习过程中也踩了很多坑,急切需要一本异步编程的书籍来为自己的学习指引方向。

  虽然Java为不同技术域提供了相应的异步编程技术,但是这些异步编程技术被散落到不同技术域的技术文档中,没有一个统一的文档对其进行梳理归纳。另外这些技术之间是什么关系,各自的出现都是为了解决什么问题,我们也很难找到相关资料来解释。学习异步编程也就成了程序员面临的一大挑战,要想写出优秀的异步编程代码,既需要对异步编程的原理有深刻的理解,也需要对各种异步编程框架有熟练的掌握,没有一本专业的书籍领路,可谓是异常的艰难。好在加多老师出了《Java异步编程实战》这本书,深入剖析了Java、go语言编程,相信通过阅读此书,可以让你对异步编程的理解更上一层楼。

  《Java异步编程实战》针对各种常见异步编程场景,从编程语言、开发框架等角度深入讲解了异步编程的原理和方法。作者是资深Java技术工程师,就职于淘宝,有多年的Java研发经验,在Java并发编程、异步编程等方面有深入研究和积累。对JUC包源码有深入的理解,熟悉常用开源框架实现原理。并著有畅销书《Java并发编程之美》。整本书由浅入深,是一部全面解析Java异步编程的著作,针对各种常见异步编程场景,从编程语言、开发框架等角度深入讲解了异步编程的原理和方法。本书首先介绍了异步编程的概念、适用场景,以及如何使用线程和线程池来实现异步编程;再讲解JDK中的各种Future及其内部实现原理,然后讲解如何使用Future实现异步编程,以及如何结合JDK8 Stream 和Future实现异步编程;以及对Spring框架中提供的异步执行能力进行详细分析,包含Spring中如何对TaskExecutor进行抽象,如何使用注解@Async实现异步编程,以及其内部实现原理;最后讲解了最近比较热门的反应式编程相关的内容,包含什么是反应式编程,如何使用反应式编程规范的库RxJava和Reactor库实现异步编程。全书注重理论与实践相结合,且每个异步技术点都附有代码实例,帮助读者加深理解。早买早享受,赶快点击下面的链接买起来吧。

  购买链接:https://item.jd.com/12778422.html

  《Java异步编程实战》读后感(五):聊一聊Java异步编程

  异步编程

  首先说下什么是异步,什么是同步。

  同步是A调用了某个方法B,A会在B的执行过程中一直等待,直到被调用的方法B返回时A结束等待,并继续执行下去,这种是调用方法和被调用方法在不同的线程中运行,调用方还需要等待被调用方结束才继续执行的过程就是同步,其实也是阻塞式调用。

  异步是A调用B之后,直接返回,即在被调用方计算完成之前即可返回,把剩余的计算任务交给另一个线程去做,A和B两个线程是异步的,这就是非阻塞调用。那可能会疑惑,这种异步调用B的返回结果怎么告诉A呢,其实是通过回调函数或者A执行等待,直到B完成计算即可。

  简单聊下我接触Java异步编程的经历,之前做Android的时候需要前台显示一个“数据正在加载......”的界面,后台去数据库里面取数据,这个时候就用到了Java异步编程,两个线程异步执行,等后台从数据库拿到数据之后,前台停止刷新,把后台结果显示在手机上,这就好比我们平时用的软件里面显示“正在支付”,“正在查询,请稍后”的道理是一样的,可见异步编程随处可见,是每个程序员都要去了解的。

  异步编程需要学的知识点

  结合自身的经历,说下面试过程中以及工作过程中比较常用的一些Java异步编程知识点。

  1. 经常问到的异步编程的两个关键字是volatile和synchronized,从字面意思就可以看出来,volatile是保证变量的可见性(一个线程原子操作修改了一个变量之后,其他线程保证可以拿到最新的值),synchronized是保证方法的同步(这里的同步是多个线程访问这个代码块和方法时,只能有一个线程进入,等该线程执行结束之后,其他线程才能进入执行)。既然synchronized方法可以保证多个线程阻塞在方法之外,如果线程过多,锁住的方法执行时间较长,会占用过多的资源,处理不好会显著较低程序的执行效率,因此控制好并发的粒度是非常重要的;

  2. 其次,刚刚谈到了锁,Java里面有偏向锁,轻量级锁,重量级锁,这些锁什么时候用,Java虚拟机底层是怎么控制的。这些锁的思想其实与我们使用数据库时加的锁是一致的,我们需要在线程安全和线程等待时间做好控制;

  3. Java线程除了单独创建以外,一般是要交给线程池去管理,这样能够灵活有效的使用多线程编程,那么线程池里面的参数都有哪些含义,当线程池中的线程不足以处理当前任务时我们需要采取哪些策略去解决,以及不同场景如何选择合适的线程池都是需要去考虑和学习的;

  4. 最后理解了线程的基本原理之后,业界为了实现异步编程设计了很多中间件和框架,这些中间件底层是怎么实现的,Java8语言中又推出了哪些新的特性去解决异步编程的问题,我们日常访问的淘宝等网站,参加的抢红包活动,是怎么解决IO阻塞问题的,这些都是需要进一步去思考,去体会的。

  好书推荐

  你还在为学习多线程而苦恼吗,想不想系统的掌握多线程编程以及并发的思想呢,除了多线程底层的技术以外想不想多了解些分布式框架呢,除了理论以外想不想动手实践下呢,下面给大家推荐一本翟陆续的《Java异步编程实战》一书,这是一部全面解析Java异步编程的著作,针对各种常见异步编程场景,从编程语言、开发框架等角度深入讲解了异步编程的原理和方法。作者是淘宝的资深Java技术工程师,在Java异步编程、并发编程领域有深厚的积累。

  当当购买链接:http://product.dangdang.com/28499408.html 快来一起学习吧,为自己充电!

  《Java异步编程实战》读后感(六):异步编程之美

  在大学毕业后的工作期间,从最开始的编写同步代码,到慢慢为了提高系统性能,把一些任务使用异步的方式来处理,从而提高系统的响应时间,那么就会产生一些新的问题,如何监控在异步线程执行的任务的执行状态,是否出现了错误,出现了错误怎么处理,系统创建大量线程又该如何统一管理,这些种种问题都让使我意识到深入了解异步编程的必要性。

  同步的代码, 在很多情况下, CPU其实是在等待中度过的, 比如等待一个网络连接, 等待MySQL服务器的数据返回异步的代码, 就是把这些等待的时间给充分利用起来了, 把网络连接, 访问数据库这种耗时的工作时都在注册一个callback或者event之后切换出来,让CPU先去干别的活(例如响应别的请求), 当网络连接,数据库返回结果时再回来执行刚才的callback中的代码,异步的代码可以大大的提升系统的容量上限, 因为充分利用了空闲的CPU时间, 但是对于单个的请求的性能提升帮助比较有限 (除非你的单个请求大量依赖这种IO操作)。

  Java的异步编程其实是一个充分利用计算机CPU资源,不想让主程序阻塞在某个长时间运行的任务上,这类耗时的任务可以是IO操作、远程调用以及高密度计算任务。如果不使用多线程异步编程,我们的系统就会阻塞在耗时的子任务上,会导致极大延长完成主函数任务的时间。Java以及提供了丰富的API,来完成多线程异步编程。从NIO、Future,CompletableFuture、Fork/Join以及parrallelStream。另外google的guava框架提供了ListenableFuture和Spring的@Async来简化异步编程。

  在我来到现在这家公司的时候,老大就安排我一个任务,要我对线程池进行监控,如果线程执行失败,需要记录下来,并发送送通知,其实那时候我对异步编程的理解仅仅是new Thread()的阶段,对于线程池的概念都还很模糊,好几次面试的时候面试官问我,创建线程池有多少中方式,说说线程的特性,那时候我都是一脸懵逼的,话说回来,为了解决老大交给的这个任务,我开始阅读一些资料来对加强对异步编程的理解,一步一步调试查看ThreadPoolExecutor的源码,不断尝试在哪些环节可以加入监控,最终自己实现了一个可监控的ThreadPoolExecotor,让线程执行不再不可知,也不用再手动的去恢复线程执行失败的数据,那时候线程执行失败完全不知道,全靠线上日志一点一点排查,真的是心塞,从这个事情之后,对于异步编程的也有了一些初步的了解,也醉心于其中的研究。于是在空闲之余又研究了ForkJoin框架,对于这个新东西,使用起来真的是大大的提高效率,同样的自己实现了一个可监控的ForkJoin,对递归处理的第一个错误进行捕获,并且暴露函数式接口,来针对执行失败的回滚处理。在整个对异步编程的学习过程中,收获了许多,也希望可以阅读更多的资料来增强实战能力,这时候一本实战的异步编程的书籍就显得尤其重要了。

  异步编程是高性能程序的利器,同时也是程序员面临的挑战之一,要想写出优秀的异步编程代码,既需要对异步编程的原理有深刻的理解,也需要对各种异步编程框架有全面的掌握。之前有幸读过加多老师编写的Java并发编程之美,其通俗易懂的讲解方式帮助我完成多线程并发编程从入门到实践的飞跃!而且通过许多案例来加深对并发编程的理解,实乃居家旅行的必备书籍。现在加多老师又出了《Java异步编程实战》这本书,深入剖析了Java、go语言编程,现在对于异步编程的书籍并不多,相信通过阅读此书,可以让你对异步编程的理解更上一层楼。

  《Java异步编程实战》针对各种常见异步编程场景,从编程语言、开发框架等角度深入讲解了异步编程的原理和方法。作者是淘宝的资深Java技术工程师,在Java异步编程、并发编程领域有深厚的积累。整本书由浅入深,首先介绍了异步编程的概念、适用场景,以及如何使用线程和线程池来实现异步编程;再讲解JDK中的各种Future及其内部实现原理,然后讲解如何使用Future实现异步编程,以及如何结合JDK8 Stream 和Future实现异步编程;以及对Spring框架中提供的异步执行能力进行详细分析,包含Spring中如何对TaskExecutor进行抽象,如何使用注解@Async实现异步编程,以及其内部实现原理;最后讲解了最近比较热门的反应式编程相关的内容,包含什么是反应式编程,如何使用反应式编程规范的库RxJava和Reactor库实现异步编程,看到这里赶紧点击下面的链接买起来吧。

  当当购买链接:http://product.dangdang.com/28499408.html

扫一扫手机访问

发表评论