▶关于作者:张帆(Zachary,个人微信号:Zachary-ZF)。坚持用心打磨每一篇高质量原创。欢迎扫描下方的二维码~。
定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些思考。
如果你是初级程序员,想提升但不知道如何下手。又或者做程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注我的公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思维导图。
如果你是运营,面对不断变化的市场束手无策。又或者想了解主流的运营策略,以丰富自己的“仓库”。欢迎关注我的公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思维导图。
如果第二次看到我的文章,欢迎「左侧导航栏」或「文末」扫码订阅我个人的公众号(跨界架构师)哟~
每周五早8点 按时送达到公众号。当然了,也会时不时加个餐~
其实我知道有不少小伙伴容易将「异步」和「非阻塞」搞混。脑海里印象可能是这样的:异步=非阻塞,同步=阻塞?
其实并不是如此,Z哥我这次就想来帮你搞清楚这个问题。
同步与阻塞/非阻塞
你平时编写的代码中,大部分的「同步」调用,本质上都是「阻塞」的。但是「同步」调用也可以做到「非阻塞」的效果。
还是拿我们上一篇中提到的排队买奶茶这个例子,看看为什么说是「同步」+「阻塞」。
文章里「同步」的例子说的是,你排队买奶茶,点完单继续“占着坑”,不让后面的人点单,等里面的店员做好奶茶,你拿走了后面的才能点单。这个其实就是「同步」+「阻塞」,「阻塞」体现在哪?
因为这个时候你一直“占着坑”,生怕后面的人先点单,导致店员给他先做。所以,这个时候你就死死的盯着里面,这个就是「阻塞」,因为你除了盯着其它啥都干不了。
怎么让「同步」也能不阻塞呢?
就是你虽然还是排着队“占着坑”,但是人没闲着,低头玩玩手机,时不时的问里面“我的奶茶做好了没?我的奶茶做好了没?”。这个就是「非阻塞」,因为你两次询问之间会间隔一段时间,可以在这个时候做其它的事情。本质上是通过将原本的一个「大同步」拆成多个「小同步」达到「非阻塞」的效果。
上图中,几次阻塞之间空白区域就可以用于做其它事,所以是「非阻塞」的。
异步与阻塞/非阻塞
上一篇文章中的「异步」例子就是一个「非阻塞」的例子,我们来看看为什么。
奶茶店分了点单区和取餐区之后,做好的饮料就只能从取餐区拿,也意味着接待你进行点单的人并不是实际做奶茶的人。这个时候你会拿到一张取餐号,然后老老实实的去取餐区等着,而不是“占着xx不xx”。
如果你很着急要拿到奶茶,不断的问里面“我的奶茶做好了没?我的奶茶做好了没?”,那这个还是「同步」+「非阻塞」的模式。因为这个过程没有产生「回调」,是你在不断的主动发起“请求”。
但如果你不着急,就在边上开一局吃鸡,等着里面做好了叫号,到你号码了再去拿。这就是「异步」+「非阻塞」。因为这个事情是对方(里面的店员)触发完成的,这就是「回调」,是对你之前的“点单”请求进行的响应。一来一回完成一个完整的交互。
到这可能你会说,那异步不还是天然「非阻塞」的么?No、No、No。
阻塞不阻塞是你自己决定的,你可以阻塞啊。比如,你等的“回调”时候发现没带手机,玩不了吃鸡,那只能傻傻的在那等着,啥也干不了。如此,这个过程虽然还是「异步」的,但对你来说就是「阻塞」的。
工作中的同步/异步&阻塞/非阻塞
「同步」+「阻塞」。这种最常见,平时写的大部分代码都是如此,就不多说了。
其实你仔细想一下就会发现,很多知名的框架,都是「同步」+「非阻塞」的,为什么呢?因为你可以继续像「同步」一样编写代码,但是可以享受到类似「异步」所能带来的更好的性能,何乐而不为?
比如大名鼎鼎的linux中的io复用模型poll/select/epoll,本质上都是「同步」+「非阻塞」的。还有知名网络通信框架Netty。
我们在设计对外的api的时候也可以使用这种模式,降低一些耗时接口调用所产生的影响。这个阮一峰老师已经写的非常清楚了,我就直接贴个链接:http://www.ruanyifeng.com/blog/2018/12/async-api-design.html。
之所以大家会有错觉,认为「异步」=「非阻塞」,其实也不是没有道理。为什么呢?因为我在脑海中搜寻来一番,的确没想到有什么知名的框架/设计是使用「异步」+「阻塞」来实现的。如果哪位小伙伴有补充,可以在评论区留言告诉大家。
「异步」+「非阻塞」就多了。任何你看到callback关键字的框架都是。
总结
好了,我们一起总结一下。
这次呢,Z哥先通过同步/异步、阻塞/非阻塞之间形成的4种组合形式,聊了下它们到底是怎么回事。
然后和你聊了一下工作中哪里能看到它们的存在,以及在一些典型场景下适合用哪一种模式。
希望对你有所启发。
最后送你一个记住这4个概念的最好办法。
-
同步阻塞:你干吧,我看着你干
-
同步非阻塞:你干吧,我每隔5分钟来看看
-
异步阻塞:你干吧,好了告诉我,我等着
-
异步非阻塞:你干吧,好了告诉我,我先去忙别的了
如果还是记不住,那就记住同步/异步表示“过程”,阻塞/非阻塞表示在这个过程中的“状态”。至于这句话是怎么来的,回来看这篇文章就行。
相关文章:
作者:Zachary
出处:https://www.cnblogs.com/Zachary-Fan/p/blocknonblock.html
如果你喜欢这篇文章,可以下方扫码关注我的个人「原创」公众号哦。
相关推荐
在深入探讨不同分布式事务解决方案之前,我们首先需要理解分布式系统中的两个核心概念——ACID特性和CAP理论。 **ACID特性**: 1. **原子性(Atomicity)**:确保事务要么全部成功,要么完全失败,不允许部分成功...
6. **BIO/NIO/AIO**:BIO是同步阻塞,NIO是同步非阻塞,AIO(Async IO)是异步非阻塞,AIO在Java 7引入,提高了I/O效率。 7. **多线程**:Java通过继承Thread类或实现Runnable接口创建线程,重写run()方法。线程...
CAISO定义了三种资源模型——代理需求响应资源(PDR)、分布式能源(DER)和非发电资源(NGR),每一种资源模型都有其特定的性能要求和服务范围。这些资源模型为储能装置参与电力市场交易提供了不同的身份和规则。 ...
在构建分布式系统时,Spring Cloud Gateway 作为新一代的微服务网关,被广泛采用来替代Zuul。本文将深入探讨在使用Gateway时需要注意的一些关键点,以避免潜在的问题和陷阱。 首先,让我们理解Spring Cloud Gateway...
- NIO(非阻塞I/O):选择器、通道、缓冲区的概念,以及其相对于传统IO的优势。 5. **反射与注解**: - 反射机制:动态获取类信息,创建对象,调用方法,修改属性,以及反射在设计模式中的应用。 - 注解:元数据...
在这个"java-demo"项目中,我们可以深入学习Java技术,特别是关于多线程、IO流以及两种不同的IO模型——阻塞IO(BIO)和非阻塞IO。此外,还涉及到Netty框架的应用,这是一个高性能、异步事件驱动的网络应用框架,常...
7. **IO/NIO/BIO**:理解Java的输入输出模型,包括BufferedReader、FileInputStream等基本IO流,以及非阻塞IO(NIO)和BIO的区别和应用场景。 8. **网络编程**:理解TCP/IP协议,会编写Socket编程,了解HTTP协议,...
在这种架构中,系统通过异步非阻塞的通信方式处理请求,确保资源的有效利用,并能优雅地处理故障。消息模式是响应式架构中的关键组件,它允许组件之间通过消息传递进行通信,而无需直接相互依赖。 消息模式在Actor...
当有新的消息到达时,容器(如WebLogic、Glassfish或WildFly)自动激活MDB实例来处理消息,这使得应用能够以非阻塞的方式处理请求,提高了系统的可扩展性和可靠性。 JMS与MDB结合使用,可以构建出高效且健壮的企业...
此外,集合框架(如ArrayList,LinkedList,HashMap,TreeMap等)和IO/NIO(输入输出/非阻塞I/O)也是必考知识点。 3. **并发编程**:在多线程环境下,理解线程同步、锁机制(如synchronized,ReentrantLock等)、...
9. **Spring Cloud**:在分布式系统中,Spring Cloud为开发者提供了开发微服务所需的各种工具,如服务发现、配置中心、断路器、智能路由、负载均衡等。 10. **Spring AOP增强**:Spring5对AOP进行了优化,支持更多...
5. **JVM多核编程**:线程管理和同步、锁与条件变量、非阻塞并发、Java内存模型(JMM)以及性能优化技巧。 6. **Akka框架**:Scala中广泛使用的并发库,用于构建高可用、容错的分布式系统。 7. **Scala与大数据**:...
- 在设计代码时,充分理解业务需求和性能瓶颈,针对性地进行优化,如使用非阻塞或异步机制来减少同步开销。 5. **其他应用**: - 这种优化方法不仅适用于Cobar和Sentinel这样的中间件,也可以应用于任何需要高效...
4. **异步处理**:对于非实时性的任务,如发送邮件、数据分析,可采用消息队列进行异步处理,避免阻塞主线程。 5. **资源池化**:数据库连接池、线程池等资源池技术,可以有效管理资源,减少创建和销毁资源的时间...
Java网络编程是软件开发中的重要领域,特别是在分布式系统和互联网应用中不可或缺。本文将深入探讨标题和描述中提及的几个关键知识点:Java套接字编程、Java的网络功能与编程基础、TCP网络协议以及Java Transaction ...
通过合理的配置和分析,可以有效地提升Java应用的稳定性和性能,对于大型分布式系统尤其重要。在实际工作中,结合日志分析、代码审查等手段,将能更好地挖掘`javapms-1.2-beta`的潜力,实现系统的高效运维。
5. **WebFlux**:Spring 5引入了一个新的响应式编程模型——WebFlux,它为构建非阻塞、高性能的Web应用提供了可能。WebFlux基于Reactor库,能够处理高并发场景,特别适合微服务架构。 6. **数据访问**:Spring Data...
**Spring Cloud Gateway**:作为微服务架构中的重要组件,Spring Cloud Gateway提供了统一的API路由管理和各种横向关注点的支持,如安全性、监控/指标和弹性。Spring Cloud Gateway基于WebFlux框架实现,使用Netty...