您的位置:首页 > 其它

同步和异步,阻塞和非阻塞

2016-04-13 16:03 155 查看
在前不久的蘑菇街的面试中问了我Log4j的异步调用的优点,我没有答得很全。这里详细分析一下。

同步和异步

1.什么是同步?

同步:指发送一个请求,需要等待返回。然后才能够发送下一个请求

在这个定义之下,我们的绝大多数的代码都是同步执行,比如函数调用时必须等待函数流程执行完毕然后返回给调用者。

2.什么是异步?

异步:简单点不是同步的都是异步。官方定义是发出一个异步过程调用后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出之后,通过回调函数处理,或者通过状态通知

简单一点来说就是当我们去服装店买东西的时候,如果你喜欢的那件衣服缺货了,但是你又不想等,你可以喊老板到货就call你,所以你可以干自己的事,无需等待。

阻塞与非阻塞

1.什么是阻塞?

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

这里需要声明的是同步和阻塞不是等同的,同步调用很多时候线程不会挂起,但是阻塞会挂起线程。

2.什么是非阻塞

在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

两两组队

同步阻塞 同步非阻塞

异步阻塞 异步非阻塞

同步阻塞:

效率最低,专心在服装店等待服装什么都不做。

异步阻塞:

类似我们吃饭喊号一样,不能离开饭店,明显被卡在了等待上面。

同步非阻塞:

效率低下,类似我们一边打电话一边抬头看队伍排到了没有,我们需要在这两个之间来回切换。

异步非阻塞:

类似一种预定,更高级的吃饭喊号,如果你是VIP老板有位置了直接打电话给你(注册回调函数),而你不需要自己一直在饭店。

AIO?

Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。

AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。

稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: