同步、异步、阻塞和非阻塞

      这四个概念的区别一直都没怎么弄清除,先做一点小小的总结,可能会持续加深理解。

      同步:本次操作完成之后,再进行下面的操作。

      异步:本次操作没有完成直接返回,进行下面的操作。

      阻塞:当一次操作需要等待某种条件才能完成时,该操作直接挂起。

      非阻塞:等待条件时,直接返回。

      其实同步/异步,阻塞/非阻塞强调的是两个不同的问题。同步/异步强调的是操作执行的先后顺序,而阻塞/非阻塞强调的是在等待条件的时候操作是否挂起。

      有的人说同步和异步是线程相关的,阻塞和非阻塞是内核相关的,虽然不大准确,但是其实可以加深对这几个概念的理解。

      细说同步异步。比如线程的同步异步,两个线程本来是各自执行的,是没有先后顺序的,所以是异步的,但是如果你在某个方法上加了synchronized,那么当同时执行到这个方法的时候,就有先后顺序了,先来的先执行,后来的后执行,先后顺序就出来了,就是同步的了。再比如调用方法的同步异步,由于本人是做android的,就以里面的内容为例子,比如java层的aidl通信,apk获得系统service的代理,调用service的方法,就是同步方法,因为只有这个方法执行完了才能执行下面的代码,再比如jni调用也是,底层代码没返回,上层的后面代码就不会执行,但是这不是一种等待,而是上面的一条指令没有执行完。再比如handle message,只是send就返回了,而没有等待message处理完全了再返回,就是异步的,注意这里的操作不是send本身,而是对message的处理。

      细说阻塞和非阻塞。最主要的就I/O,阻塞式I/O就是在请求数据的时候,如果发现数据没准备好,就挂起,而非阻塞在请求数据时,就算数据没准备好,也是立刻返回,再轮询多次,直到数据准备完全,而这里的条件就是数据是否准备完全。而阻塞IO和非阻塞IO都是同步IO,因为在进行读取IO的时候,调用者是不能做别的事情,直到IO操作完成。而异步IO在读取IO的时候可以做别的事情,当数据读取完全后会给调用者一个通知或回调,进行处理,比如netty就是典型的异步IO,它没有管怎么读取数据的,只需要处理数据就可以了

      PS:附上unix网络编程关于同步IO和异步IO的区别

            同步IO操作:导致请求进程阻塞,直到IO操作完成

            异步IO操作:不导致请求进程阻塞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值