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

简介: 同步,异步,阻塞和非阻塞的理解

首先来说下概念:
同步:调用方等待被调用方执行完成,才能继续执行,在被调用方执行期间,调用方会一直等待。
异步:通常是被调用方直接返回一个结果,告诉调用方,我们已经接收到任务了,然后再去慢慢的执行任务。调用方直接获取到了结果,就会继续执行后面的任务。
阻塞:调用方虽然可能已经知道被调用方已经获取到任务了,但是就是想要等待被调用方真正的执行完成。
非阻塞:调用方不关心,也不会等待被调用方完成任务,因为如果有需要,被调用方会来通知调用方。

以上是我对同步与异步,阻塞与非阻塞的个人理解,其实同步和异步,主要是看被调用者的实现方式,而阻塞和非阻塞是由调用者所决定的,下面我们通过一个简单的生活例子来加强我们的理解:
情景一:10个人去面馆吃面,面馆的规矩是排队买面,即一个人付完钱,并取得面后,第二个人才能付钱拿面,这种方式就是同步的方式,效率非常低。
情景二:此时店家想了一个方法,一个人专门负责收钱,一个人专门负责下面,10个人只需要排队付钱,就能拿到小票,这样很快10个人就能完成点餐,而且下面的人也不需要一碗一碗的下了,这种方式就是异步了。
情景三:虽然我们拿到了小票,但是我们不知道自己的面什么时候好,所以我们还是在窗口前等待,这就是阻塞。
情景四:店员在每一碗好的时候,大喊一声小票号,吃面的人听到自己的号再去拿面,期间是不需要傻等,可以玩玩手机,这就是非阻塞。

在代码的角度去理解:
例如我们通过使用callable来开启一个多线程,此时是一次异步操作,如果我们不关心子线程的返回值是什么,那么我们就是非阻塞了,如果我们调用的Future的get方法,那么我们就被阻塞了。

目录
相关文章
Sendmail邮箱API发送邮件的步骤
AokSend教程:使用Sendmail API发送邮件涉及5步。1) 导入sendmail库;2) 连接SMTP服务器(如`smtp.sendmail.com:587`);3) 设置发件人(`sender@example.com`)和收件人(`recipient@example.com`);4) 编写邮件内容,包括主题和正文;5) 使用`sendmail.send()`发送邮件。AokSend提供高效、触达率高的触发式和SMTP/API接口,适合大规模验证码发信服务。
|
编译器 Linux 开发工具
|
供应链 前端开发
阿里成立数据智能新公司,瓴羊的独立始末
(转载报道媒体:晚点LatePost)推动瓴羊形成的过程中,阿里管理层选择了更激进、整合度更高的方案,选择了多平台、多云的定位。中国互联网发展二十多年,从开放走向封闭,或主动或被动,现在它正重新走向开放,这是大势所趋。
阿里成立数据智能新公司,瓴羊的独立始末
|
缓存 资源调度 持续交付
在清空NPM缓存后,检查是否所有依赖都已正确安装
在清空NPM缓存后,检查是否所有依赖都已正确安装
如何调整 YOLOv3 的 NMS 参数以优化检测性能?
如何调整 YOLOv3 的 NMS 参数以优化检测性能?
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
474 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
278 0
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
在Java多线程环境中,共享资源的并发访问可能导致数据不一致。传统的同步机制如`synchronized`关键字或显式锁虽能保障数据一致性,但在高并发场景下可能导致线程阻塞和性能下降。为此,Java提供了`java.util.concurrent.atomic`包下的原子类,利用底层硬件的原子操作确保变量更新的原子性,实现无锁线程安全。
212 0
|
存储 API 数据安全/隐私保护
邮箱收不到验证码邮件是什么原因
在互联网应用中,未收到验证码邮件常令人困扰。原因包括:邮件误标为垃圾、邮箱设置不当、发件服务器故障、邮箱地址输入错误,及ISP拦截。解决策略有检查垃圾邮件、清理邮箱、修正设置、确认邮箱地址无误、联系服务提供商与ISP,或尝试其他邮箱服务。使用AOKSend等可靠邮件服务可提升送达率,其优势在于高送达率、实时监测与易集成性,确保验证码邮件及时准确到达,改善用户体验。
|
开发框架 算法 测试技术
提升你的VB项目:模块化和代码重构的最佳实践
【4月更文挑战第27天】本文探讨了如何在Visual Basic(VB)项目中实现模块化设计和代码重构,以提升可维护性和可扩展性。通过模块化减少复杂性,遵循高内聚、低耦合原则;利用类、命名空间等实现模块化,借助.NET框架增强灵活性。代码重构包括改进结构、消除重复、封装变化点,利用现代VB特性简化代码,同时重视单元测试和持续集成确保质量。性能优化和案例研究提供实践经验,助力VB项目保持高效和适应未来发展。
417 2