这四个概念的区别一直都没怎么弄清除,先做一点小小的总结,可能会持续加深理解。
同步:本次操作完成之后,再进行下面的操作。
异步:本次操作没有完成直接返回,进行下面的操作。
阻塞:当一次操作需要等待某种条件才能完成时,该操作直接挂起。
非阻塞:等待条件时,直接返回。
其实同步/异步,阻塞/非阻塞强调的是两个不同的问题。同步/异步强调的是操作执行的先后顺序,而阻塞/非阻塞强调的是在等待条件的时候操作是否挂起。
有的人说同步和异步是线程相关的,阻塞和非阻塞是内核相关的,虽然不大准确,但是其实可以加深对这几个概念的理解。
细说同步异步。比如线程的同步异步,两个线程本来是各自执行的,是没有先后顺序的,所以是异步的,但是如果你在某个方法上加了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操作:不导致请求进程阻塞