阻塞与非阻塞和同步与非同步是可以共存的,两者并不是对立存在的,他们可以进行组合:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
同步与异步
牵扯到这两个概念的前提是两个线程会有某些微妙的联系并需要进行通信,不然牵扯不到同步与异步问题。
同步场景:我要去上厕所,去了卫生间以后发现蹲位都被占了,并且此时还有两个人在排队等候,而我又必须上厕所,此时我就必须排队等待,这就是所谓的同步。特点是必须等待,等的时间不能干其他任何事情(排队的时候还是可以玩哈手机,抽根烟的,但是蹲位有没有空出来需要自己去判断)。
异步场景:去了厕所还是蹲位占满,但是这个卫生间比较混乱,蹲位是谁进去了就是谁的排队也没用,此时我给了正在蹲坑的这个老弟100块,让他蹲完的时候给我打个电话,然后我再去蹲坑,那么在我给这位兄弟100块到他要离开的这段时间我就可以出去买包烟用来在蹲坑的时候享受一番。特点是在需要的资源空闲之前我可以干其他事情(自己不需要去关注蹲位是否空闲,这个任务已经交给了占用蹲位的人来通知)。
同步与异步用于Java,同步就不用说了,单纯的调用并等待,而对于异步则一般是用回调方法,在资源对象中定义一个回调方法来通知调用者资源的状态。这两者的特点是:同步需要调用者自己去探测资源的状态,比如用无限循环;而异步情况下资源调用者不需要去探测资源状态,这个任务完全交给被调用的资源。显然异步效率要高于同步,但是这并不绝对,要根据具体的场景来看,程序设计中往往没有最好和最坏,只能在特定的场景下才能说某一个技术的好坏。
阻塞与非阻塞
阻塞与非阻塞看起来和同步与非同步非常相似,但是还是有一定的区别的,他们的关注点不同,同步与异步关注的是资源状态由谁来探测,而阻塞与非阻塞关注的是等待资源的时候是否可以干其他事。阻塞与非阻塞和同步与非同步是可以共存的,两者并不是对立存在的,他们可以进行组合:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
这里要特别注意:很多概念或者技术它本身是一种设计思维,而不是具体的代码,比如要实现异步非阻塞,那么此时面对两个线程的通信,你完全可以在调用资源的时候在开辟几个线程来执行其他动作,而不是非要等到被调用的资源返回以后再去执行其他。