Loading

同步,异步,阻塞,非阻塞的区别

同步,异步,阻塞,非阻塞的区别

同步与异步

同步与异步的重点在消息通知的方式上 , 也就是调用结果通知的方式 ;

同步 : 当一个同步调用发出去后 , 调用者要一直等待调用结果的通知 , 直到得到调用结果 ;

异步 : 当一个异步调用发出去后 , 这个调用就直接返回了 , 调用者不能立即得到调用结果的返回 , 而是在调用发出后 , 被调用者通过状态 , 通知来通知调用者 , 或通过回调函数处理这个调用 ;

异步调用要想获得结果 , 一般有两种方式 :

主动轮询异步调用的结果
被调用方通过 callback通知调用方调用结果
举个例子 :

同步买奶茶 : 小明点单交钱 , 然后等着拿奶茶 ;
异步买奶茶 : 小明点单交钱 , 店员给小明一个小票 , 等小明奶茶做好了再来取 ;
异步买奶茶 , 小明要想知道奶茶是否做好了 , 有两种方式 :

小明主动去问店员 , 一会就去问一下 : "奶茶做好了吗?"... 直到奶茶做好 ;
等奶茶做好了 , 店员喊一声 :"小明 , 奶茶好了!" , 然后小明去取奶茶 ;

阻塞与非阻塞

阻塞与非阻塞的重点在于进/线程等待消息时候的行为 , 也就是在等待消息的时候 , 当前进/线程是挂起状态 , 还是非挂起状态;

阻塞调用发出去后 , 在消息返回之前 , 当前进/线程会被挂起 , 直到有消息返回 , 当前进/线程才会被激活 ;
非阻塞调用发出去后 , 不会阻塞当前进/线程 , 而会立即返回 ;
举个例子 :

阻塞买奶茶 : 小明点单交钱 , 干等着拿奶茶 , 什么事都不做 ;
非阻塞买奶茶 : 小明点单交钱 , 等着拿奶茶 , 等的过程中 , 时不时刷刷微博 , 朋友圈...

总结

同步与异步 , 重点在于消息通知的方式 ;

阻塞与非阻塞 , 重点在于等消息时候的行为 ;

所以 , 就有了下面4种组合方式 :

同步阻塞 : 小明在柜台干等着拿奶茶 ;
同步非阻塞 : 小明在柜台边刷微博边等着拿奶茶 ;
异步阻塞 : 小明拿着小票啥都不干 , 一直等着店员通知他拿奶茶 ;
异步非阻塞 : 小明拿着小票 , 刷着微博 , 等着店员通知他拿奶茶 ;

posted @ 2023-04-08 20:59  ydssx  阅读(25)  评论(0编辑  收藏  举报