同步异步 阻塞非阻塞
同步异步
首先来解释同步和异步的概念,这两个概念与消息的通知机制有关。也就是同步与异步主要是从消息通知机制角度来说的。
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列;所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了
异步通知的几种方式:
- 状态 :调用方需要通过轮询的方式来检查状态是否改变。
- 通知 、回调:效率较高。一般都采用这两种方式。
阻塞非阻塞
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。
阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。
同步阻塞和同步非阻塞的区别:
如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;
如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者。
其实我是赞同引文第二个的观点的。其实是没有异步阻塞这一个状态的。
同步过程的意思是,这个过程需要依赖其他任务。只有等其他任务完成了,这个任务才能继续。所以同步过程要么就是直接等待其所依赖的任务结束,或者不断的轮询所依赖过程的结果;异步过程的意思是,我的这个过程不需要依赖其他过程,在等待的过程中我可以做一些别的事情,等到等待的过程结束了,我再进行处理。
阻塞、非阻塞的意思是针对方法调用来说的。如果方法需要有结果才能返回,那么就是阻塞方法;如果方法可以直接就返回,无论有无结果,那么就是非阻塞的方法。然后非阻塞的方法就需要不断的轮询才能知道什么时候结束。
所以说正常的状态有同步阻塞、同步非阻塞、异步。
有的文章说有异步阻塞这个过程,并说这个阻塞不是阻塞在等待数据上,是阻塞在读取数据上。感觉有点儿偷换概念的意思。异步就是异步,没有阻塞和非阻塞之分,或者说异步就应该只有非阻塞,没有阻塞的这一个说法。你进程都阻塞了,还能干别的事情吗?