快来看超鸡容易理解的同步异步,阻塞非阻塞,不再担忧理解晦涩的语言了。异步
阻塞和非阻塞指的是执行一个操做是等操做结束再返回,仍是立刻返回。spa
好比餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式:线程
第一种就是阻塞方式,第二种则是非阻塞的。事件
同步和异步又是另一个概念,它是事件自己的一个属性。还拿前面点菜为例,服务员直接跟厨师打交道,菜出来没出来,服务员直接指导,但只有当厨师将菜送到服务员手上,这个过程才算正常完成,这就是同步的事件。一样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,这就变成异步的了。其实异步还能够分为两种:带通知的和不带通知的。前面说的那种属于带通知的。有些传菜员干活可能主动性不是很够,不会主动通知你,你就须要时不时的去关注一下状态。这种就是不带通知的异步。同步
对于同步的事件,你只能以阻塞的方式去作。而对于异步的事件,阻塞和非阻塞都是能够的。非阻塞又有两种方式:主动查询和被动接收消息。被动不意味着必定很差,在这里它偏偏是效率更高的,由于在主动查询里绝大部分的查询是在作无用功。对于带通知的异步事件,二者皆可。而对于不带通知的,则只能用主动查询。class
可是对于非阻塞和异步的概念有点混淆,非阻塞只是意味着方法调用不阻塞,就是说做为服务员的你不用一直在窗口等,非阻塞的逻辑是"等能够读(写)了告诉你",可是完成读(写)工做的仍是调用者(线程)服务员的你等菜到窗口了仍是要你亲自去拿。而异步意味这你能够不用亲自去作读(写)这件事,你的工做让别人(别的线程)来作,你只须要发起调用,别人把工做作完之后,或许再通知你,它的逻辑是“我作完了 告诉/不告诉 你”,他和非阻塞的区别在于一个是"已经作完"另外一个是"能够去作"。效率
这也是NIO和AIO最大的区别,就是NIO在有通知时能够进行相关操做,而AIO有通知时则表明操做已经完成后台
再举一个例子:方法
去书店借一本书,同步就是我要亲自到书店,问老板有没有这本书,阻塞就是老板查询的时候(读写)我只能在那等着,老板找到书后把书交给我,这就是同步阻塞。数据
我亲自到书店借书,老板在找这本书的时候,我能够去干别的,而后每隔一段时间去问老板书找到了没有,也能够等老板找到书之后通知我,这就是同步非阻塞。
我想借本书,找我的帮我去借,借到书之后再通知我,这就是异步,我只发起调用,可是自己并不参与这个事件,而是让别的线程去作这个事。
同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
阻塞与非阻塞是对同一个线程来讲的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
帮我借书的那我的有没有借到书,我能够打电话问他(轮询),也能够等他通知我,这是异步的通知;在借书的过程当中借书的那我的能够轮询的方式查看书是否已经找到(缓冲区有没有数据),找到了你能够把它拿走,也能够等老板找到书后通知我,这是非阻塞的通知与轮询。