同步/异步、阻塞/非阻塞辨析
关键词:同步、异步、阻塞、非阻塞
相关概念:网络编程、进程与线程、I/O模型
一、问题背景
同步和异步,以及阻塞和非阻塞都是网络编程中经常遇到的概念,单看文字上的解释确实有些晦涩
难懂。接下来我们将从一个通俗的例子出发阐述它们的区别与联系
二、一个简单的例子
隔壁老王爱好茶艺,每天都会煮开水来泡茶
场景一:老王将水壶放在火上,坐在旁边等待水开 (同步阻塞)
但是这样很耽搁时间,又不自由,效率很低,老王想换种方法
场景二:老王将水壶放在火上,自已去隔壁了,每隔3分钟来看下水开没有 (同步非阻塞)
但是这样依旧很麻烦,老王就买了一个自动报警的水壶
场景三: 老王用新买的水壶进行烧水,坐在旁边等待水开 (异步阻塞)
老王便想没有必要在水壶旁边坐着啊
场景四: 老王新买的水壶放在火上,自己去隔壁了,等着报警再回来 (异步非阻塞)
这种方式是最让老王省心的
小结: 同步和异步关注的焦点在于我们是否需要不断地去看水壶是否开了,同步时,需要老王不断
地去轮询水壶是否开了,效率是比较低下的。而异步时,水壶告警提醒老王它开了
阻塞和非阻塞 关注的焦点在于老王是否需要坐在水壶旁边等待,在水壶旁边等待老王就是阻
塞的,去做其他事的老王就是非阻塞的
这个例子可以帮助我们初步地理解同步异步、阻塞和非阻塞之间的联系和区别,但是如果详细
的“追究”起来,还有许多未解释的细节
三、理论阐述
1.同步与异步
同步和异步(syn & asyn),描述的是在单线程中一次方法调用后,执行者是否具备主动通知
的功能。同步时调用者会等到方法调用返回后才能继续后面的行为,异步时调用者不需要等到方法返回,
方法执行完毕后会主动通知调用者
2.阻塞和非阻塞
阻塞和非阻塞关注是调用者是否可以执行多个任务,描述的是调用者的多个线程是否可以同时执
行。阻塞时,多个线程不能同时进行;非阻塞时,多个线程可以同时进行
3.二者的区别与联系
同步和阻塞完全是在单线程和多线程这两个维度上的概念,它们之间并没有强制的联系。但是从
实际的意义来看确实有一定的绑定关系,比如对于单线程来说,不管是同步还是异步,肯定是阻塞的,非
阻塞只有多线程而且异步的时候才能发挥作用。
回来继续看烧水的例子,老王在烧水的同时去隔壁,也即在烧水这个线程之中,又开启了去隔壁
这个线程,所以使用异步非阻塞才更加有意义