阻塞非阻塞与同步异步的区别(清晰解释)

一、先来个例子理解一下概念,以银行取款为例: 

  • 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写);
  • 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API);
  • 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);
  • 非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)

二、总结

    1.从调用方和响应方角度看:

    同步/异步:   从调用方的角度看(比如调某个方法后,同步:等结果;异步:不等结果,让别人告知结果)

    阻塞/非阻塞:从响应方的角度看(比如相响应请求后后,阻塞:不管能不能把活干完,就开干,可能有结果,也可能没有结果; 异步:如果能马 上干完,就开始干活并返回结果“干完了”,如果不能马上干完,就马上返回结果“还不能开干,再等等吧”。)


    2.从数据访问的方式函数(程序)运行的方式角度看:

同步与异步:针对数据访问的方式,程序是主动去询问操作系统数据准备好了么,还是操作系统在数据准备好的时候通知程序。

阻塞与非阻塞:针对函数(程序)运行的方式,在IO未就绪时,是等待就绪还是直接返回(执行别的操作)。


你可能感兴趣的:(java)