Java语言异步非阻塞模式

本文首先介绍异步非阻塞模式,从线程模型的角度分析阻塞和非阻塞模式的区别。之后介绍 Promise 设计模式的应用场景及工作流程。最后,提供一种简易的 Java 实 现,能够实现基本的功能需求,并做到线程安全。

在正式探索技术问题之前,我们先来看看什么是 异步非阻塞模型 。如图1-1所示,展示了两个小人通信的场景:

假设左侧小人发起请求,而右侧小人处理请求并发送响应:左侧小人先投出一个苹果request,被右侧小人接收到;右侧小人进行处理后,再投出苹果 response,被左侧小人接收到。我们考察左侧小人在等待响应期间的行为,根据他在等待 response 期间是否能处理其他工作,将其归纳为“同步阻塞”和“异步非阻塞”两种模式。

太详细了!Java语言异步非阻塞模式(原理篇)

Java语言异步非阻塞模式(原理篇)

图1-1 两个小人通信

首先我们看看同步阻塞式通信的流程,如图1-2a所示。

太详细了!Java语言异步非阻塞模式(原理篇)

太详细了!Java语言异步非阻塞模式(原理篇)

图1-2a 同步阻塞式通信

接下来我们看看异步非阻塞式通信的流程,如图1-2b所示。

这里的大喇叭可以用 NIO 或 AIO 来实现。简单来说,NIO 是指不停地轮询每个盘子,一旦看到苹果就发出通知;AIO 是指在收到苹果时直接触发通知,而没有轮询的过程。当然,本系列文章的读者并不需要了解更多实现细节,只需知道异步非阻塞模式依赖于“大喇叭”来实现,它替代小人等待接收 response,从而解放小人去处理其他工作。

太详细了!Java语言异步非阻塞模式(原理篇)

Java语言异步非阻塞模式(原理篇)

图1-2b 异步非阻塞式通信

根据上面的分析,同步模式具有下列严重 缺点 :

我们考虑下面两种情况,如图1-3所示。

太详细了!Java语言异步非阻塞模式(原理篇)

Java语言异步非阻塞模式(原理篇)

图1-3a channel复用

太详细了!Java语言异步非阻塞模式(原理篇)

太详细了!Java语言异步非阻塞模式(原理篇)

图1-3b 线程复用

在这一章里我们用漫画的形式,初步体验了同步阻塞模式与异步非阻塞模式,并分析了两种模式的区别。接下来我们从Java线程入手,对两种模式进行更加正式、更加贴近实际的分析。

在 Java 程序中,线程是调度执行的单元。线程可以获得 CPU 使用权来执行代码,从而完成有意义的工作。工作进行期间,有时会因为等待获取锁、等待网络 IO 等原因而暂停,通称“同步”或“阻塞”;如果多项工作能够同时进行,之间不存在约束、不需要互相等待,这种情况就称为“异步”或“非阻塞”。 受限于内存、系统线程数、上下文切换开销,Java 程序并不能无限创建线程;因此,我们只能创建有限个线程,并尽量提高线程的利用率,即增加其工作时长、降低阻塞时长。异步非阻塞模型是减少阻塞、提高线程利用率的有效手段。当然,这种模型并不能消除所有的阻塞。我们首先来看看 Java 线程有哪些状态,其中哪些阻塞是必要的,哪些阻塞可以避免。

Ja

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值