同步就是在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了。调用时调用者主动等待这个结果。
异步就是调用在发出后,调用者就走了,不会等在那里什么事情也不做,但是调用者也不会立刻得到结果。当被调用者完成任务后,会通过状态,通知来通知调用者,或者通过回调函数来处理这个调用。
如,你打电话问问题,对方说,我思考一下
你电话不挂,什么都不做,在那里等着,就是同步。
电话挂了,等到他想到再打给你,就是异步。
这种同步异步的区分常常用在需要长时间等待的场景,如果执行一个耗时操作,你要等这个操作结束再做其他事,就是同步。你不等这个操作结束就去做其他事,等到有操作结果,再通过被调用者发送消息或者通过回调函数传递信息告诉调用者,就是异步。
一般情况下,项目中会选择异步通信的方式,因为选择同步通信,整个进程都会等待一个耗时操作的处理,有可能就会出现ANR现象。但是对于一些对先后顺序有要求的操作,比如加锁解锁等操作,读取信息的前提是必须要得到资源的锁,所以在得到锁这个操作完成之前,是不能往下继续执行的。
同步跟阻塞很像,但是同步的时候进程还在运行,CPU还在运行,阻塞的时候是申请一个资源申请不到或者现在在进行IO操作,所以是处于一个等待状态,没有在CPU上运行。而且同步的时候线程有可能阻塞有可能不阻塞。异步的时候线程也是可能阻塞可能不阻塞。