阻塞与非阻塞

阻塞与非阻塞的关系

当前执行流是否被暂停? 如果我们的代码因为调用某些函数而被暂停运行,那么就是阻塞的,如readsleeprecv ,都涉及到系统调用,会释放当前CPU资源。

此时,操作系统会把CPU切换到其他执行流中,当前执行流被暂停,因此发生了阻塞。

比如一个场景:我们知道java代码的执行都是要被转换成二进制流在内存中执行的,比如涉及到读取文件的操作时,文件是存放在磁盘 上的,那么这就涉及系统调用:

read( )函数 ,同时我们知道磁盘的读写速度是远远慢于内存中的,因此cpu也不可能去傻傻等待磁盘读写这一漫长的过程,于是就会暂停当前执行流,这就是阻塞。

执行流:CPU执行一段机器指令(这个机器指令通常是由编译器编译好了的,放在内存中,由CPU执行)

执行流和线程的区别

比如发生上面阻塞的情况:

执行流

执行流会被中断,直到阻塞操作完成之后,CPU分配,执行流继续执行,会恢复到被阻塞的位置。

线程

线程的角度,当前线程从运行态 变为阻塞态,该线程会释放CPU资源,操作系统可以将CPU分配给其他线程或进程。

阻塞与非阻塞的案例

非阻塞调用

public int sum(int a, int b){

return a+b;

}

那如果在进行计算之前调用sleep ()函数,这时sum()的调用就是阻塞的了,因为任何调用sum()函数的线程都会被暂停运行10秒
阻塞调用

public int sum(int a, int b){

Thread.sleep(10)

return a+b;

}

同步阻塞 和 同步非阻塞

同步和阻塞有些相似:不过从编程角度上来看,同步调用不一定是阻塞的,就像上面的加法。
同步不一定是阻塞的,阻塞一定是同步的
异步阻塞 和 异步非阻塞

异步之间代表两者之间是没有任何依赖关系的,因此不存在异步阻塞的情况

异步非阻塞,既然是异步,那么阻塞就和当前上下文没有任何关系了,一般都是异步非阻塞的组合

同步与异步

同步

调用者和被调用者 存在依赖关系 ,调用者必须要等待被调用者正常返回 才可以继续执行下一步的操作
异步

调用者和被调用者之间 没有任何依赖关系,仅仅是将任务发布出去之后然后,立即返回 紧接着执行下一步操作了。程序被编译后变成cpu可以识别的机器指令,cpu执行这些指令表现出来就是程序正在运行。

相关推荐
资生算法程序员_畅想家_剑魔6 分钟前
Java常见技术分享-设计模式的六大原则
java·开发语言·设计模式
Howrun77716 分钟前
C++ 智能指针_详细解释
开发语言
Cherry的跨界思维18 分钟前
【AI测试全栈:质量】40、数据平权之路:Python+Java+Vue全栈实战偏见检测与公平性测试
java·人工智能·python·机器学习·ai测试·ai全栈·ai测试全栈
刀法如飞18 分钟前
从零手搓一个类Spring框架,彻底搞懂Spring核心原理
java·设计模式·架构设计
编程大师哥22 分钟前
JavaScript DOM
开发语言·javascript·ecmascript
dazzle23 分钟前
Python数据结构(四):栈详解
开发语言·数据结构·python
毕设源码-邱学长27 分钟前
【开题答辩全过程】以 基于java的办公自动化系统设计为例,包含答辩的问题和答案
java·开发语言
weixin1997010801628 分钟前
马可波罗 item_get - 获取商品详情接口对接全攻略:从入门到精通
java·大数据·人工智能
json{shen:"jing"}34 分钟前
10_自定义事件组件交互
开发语言·前端·javascript
小北方城市网34 分钟前
Spring Boot 接口开发实战:RESTful 规范、参数校验与全局异常处理
java·jvm·数据库·spring boot·后端·python·mysql