同步异步、阻塞与非阻塞

阻塞:主要针对线程来说,跟踪源码最终会发现线程wait在某个方法上,等待被唤醒。在消息通信中,表现为来了数据后解除阻塞,比如阻塞队列模型中的notFull.await()/notEmpty.signal()和notEmpty.await()/notFull.signal(),以及Socket阻塞通信模型中的阻塞I/O:read/write方法要await数据到来/数据写入完毕才可解除阻塞,继续线程执行


非阻塞:不会出现wait方法。比如NIO的I/O多路复用模型,不会使用阻塞的InputStream.read或OutputStream.write,而是换一种策略,用多路复用器Selector轮询每次可读Channel.所谓可读,是已经由另一方异步写完成的数据。如可读,直接可从接收方网络缓存中读取,读取耗时是确定的,不会出现无限期阻塞等待数据的情况,所耗时间是程序执行时间,不是白白await的无限期时间。如果不可读,实际上是Channel上没有被可读监听(接收方注册,系统底层在内核收到数据后调用)标记为可读,那么会跳过对该Channel的读写而不是无意义阻塞等待


同步:主要针对消息发送和普通ACK、业务回复消息上报的业务情形。同步仍然是线程阻塞,只不过增加了私有业务的处理逻辑,在ACK或业务回复消息到来时由业务程序而不是语言内部实现来解除阻塞,这样完成一个消息的发送和结果接收过程。


异步:网络传输中的异步模型,是内核支持的一种模式。是把数据监听和复制到用户缓存的任务全部交给底层。上层程序只管发送,立即返回。不用管接收,系统完成一切后会直接给出内存层面数据,通知程序,程序拿来数据直接用,没有手动处理内核到用户缓存的复制过程。API中也是循环接收,但是异步接收,由系统底层在内核复制到用户完毕后回调,回调直接是读写完成后的回调,也就是其中获取的消息直接是业务消息。目前主要应用在对实时处理不太敏感的通信领域。一般我们都用多路复用,使用程序从内核复制数据并处理,实时性和业务控制性较强


业务逻辑消息发送/接收中的异步,主要指异步上报。指发送程序发送一条指令后立即返回。通过在消息体类中指定异步回调函数,向异步接收程序注册监听。独立线程的异步接收程序通过缓存和回复消息中的标识在接收到同一个消息的异步回复后,调用回调函数完成业务回复后的业务处理逻辑。


JMS中的客户端消息处理同步异步:同步是在消费者客户端中进行同步阻塞等待(想想阻塞队列模型,和阻塞I/O模型),来一条消息后处理一条;异步是向服务端(mq)注册回调函数,让服务端处理,mq在接收到一条消息后立即调用客户端处理逻辑的代码(回调),替客户端完成业务数据存储(存入客户端的数据结构中)或处理逻辑。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值