同步异步阻塞非阻塞详解

以下为个人理解(有点片面,但适合初学者,或后期思考),读者不理解或者我误导了,请直接评论,当天回复

场景:厕所排队

一个厕所并且只有一个坑位,有十几个人排队,你排在第二的位置,你一离开,就得重新排队!

 

1.你需要一直盯着厕所门,查看里面的人是否搞定出来了.

你自己在这期间不能离开干其他事.比如不能在座位上打代码

(这里极为容易混淆同步与阻塞关系)

自己反复查看->同步

坑位一直被占用的状态,需要等待坑位被"释放"->阻塞

同步阻塞

大白话:自己去查看是否有空位(同步),厕所不能够为我提供坑位,等待有人出来(阻塞)

 

2.你还是需要一直盯着厕所门,查看里面的人是否搞定出来了.

但是你找了一个同事帮你看着位置,厕所里的人搞定了,同事会过来通知你.(不是IO多路复用)

你可以在这期间能离开去干其他事.比如可以继续呆在座位上打代码

(这里极为容易混淆异步与非阻塞关系)

自己不用反复查看,其他人通知你->异步

坑位一直被占用的状态,需要等待坑位被"释放"->阻塞

异步阻塞

大白话:同事替我去查看是否有空位,有了就告诉我(异步),厕所还是不能够为我提供坑位,等待有人出来(阻塞)

 

3.你还是需要一直盯着厕所门,查看里面的人是否搞定出来了.

但是现在情况变了,厕所坑位变成了N个,不需要排队了,每个人直接去上就行.即不需要知道厕所里面的人是否搞定了

自己需要反复查看->同步

有坑位未占用,不要要等待坑位被"释放"->非阻塞

同步非阻塞

大白话:还是需要自己去查看是否有空位(同步),直接发现厕所有空坑位直接去上(非阻塞)

 

4.你还是需要一直盯着厕所门,查看里面的人是否搞定出来了.

但是你找了一个同事帮你看着位置,厕所里的人搞定了,同事会过来通知你.

但是现在情况变了,厕所坑位变成了N个,不需要排队了,每个人直接去上就行.即不需要知道厕所里面的人是否搞定了

自己不用反复查看,其他人通知你->异步

有坑位未占用,不要要等待坑位被"释放"->非阻塞

异步非阻塞

大白话:同事替我去查看是否有空位,有了就告诉我(异步),直接发现厕所有空坑位直接去上(非阻塞)

 

如果还不明白:

可以想一下自己上厕所,同事帮你看着坑位.

 

1.通讯方式:

同步:必须自己确认执行完了没有.

异步:不需要自己确认执行完了没有,有人会通知你.

2.等待状态:

阻塞:等待前一个程序执行完毕,才能继续执行.

非阻塞:不需要等待前一个程序执行完毕,才能继续执行.

 

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

你可能感兴趣的:(javaSE)