我与异步编程的故事

我与异步编程的故事

在最开始学习Java的时候,就只会从上往下一把梭地写代码,代码的编写顺序跟其执行顺序保证完全的一样,直到一堂Java课上面老师提到了一个问题:计算机的CPU就跟一个个小人一样,每个小人都只能在同一时间做一件事情,这时候如果我们的代码里面都是同步地,自上而下地做一件事情,那么势必只会有一个小人在工作,其他小人就只能干瞪眼。既然计算机要搞这么多的CPU核数,肯定不会是为了好看的,如果我们能让我们的程序同时让所有的小人都进行工作,那工作效率将会大大提升。这时候我的编程世界中就多了异步的概念,最开始会写个new Thread().start()来开个新线程做事情(那个时候还一直搞不清这个Thread方法的run()方法和start()方法的区别是什么 ̄□ ̄|| ),但是后面就发现了一些问题:
两个线程的对于同一个变量的修改会有冲突问题,开了新线程之后,我主线程想获取这个新线程计算的结果该怎么办?如果我开的线程的数量远远大于我CPU核数的时候,我这些线程是如何进行工作的?
也是在后面的不断学习之中,了解了控制线程同步的方式:使用synchronized或者Lock进行加锁。了解到了并发编程之中的原子性,可见性,有序性等概念。
对于开了新线程之后,主线程想获取新线程计算的结果的问题,就引出了Future的概念,我们可以在开启新线程之后,将这个新线程的Future对象,在我们主线程做完其他的事情之后,同步阻塞地获取原先那个新线程的返回值。我在学习RPC的原理的时候,就有碰到过这个问题,在RPC传输层使用Netty在进行网络通讯的时候,因为一条Channel上面会有各种各样的请求,但是我们的每次请求都需要与其对应的返回值一一对应,这时候我们需要在发送方的数据包中新增RequestId的一个唯一Id,然后需要将其返回值封装为一个Future对象,然后服务方将这次请求处理完之后,在其对应的Response数据包中也需要添加Request请求数据包之中的那个唯一Id并返回给发起方之后,发起方根据这个唯一Id,在请求池中找到其对应的那个Future对象,并将其返回值设置到对应的Future对象之中,即完成了这次请求。
后面再深入了解NIO的时候,接触到了同步与异步,阻塞与非阻塞的概念,当时真的是一脸懵逼,感觉这些概念特别的绕,一直无法理解什么叫阻塞,什么叫非阻塞,后来在不断的了解中大概有了一些想法:同步和异步其实指的是,请求发起方对消息结果的获取是主动发起的,还是等被动通知的。而对于阻塞来说,通常指的是针对IO的操作,如网络IO和磁盘IO等。简单的来说就是我们调用了一个IO函数之后,当前线程是一直挂起直到IO操作完成,还是当前线程先去做其他事情,但是时不时去查看下当前的IO操作是否完成。

本次了解到华章图书出新书《Java异步编程实战》,因为我一直依赖对于异步编程都非常有兴趣,并且得知到本书中有关于反应式编程,以及中间件中关于异步的实现,这些也都是我非常感兴趣的部分,希望能从本书中得到相关知识的学习。最后,希望本书能够大卖!!

你可能感兴趣的:(我与异步编程的故事)