java - 同步/异步与阻塞/非阻塞之间的差异具体是什么?

查看:149
本文介绍了java - 同步/异步与阻塞/非阻塞之间的差异具体是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

就我的理解,同步/阻塞是同一概念,都是客户端等待服务端的回执,服务端不返回回执,客户端就不往下走;而异步/非阻塞则是客户端不等待服务端的回执,直接往下走,等到服务端处理结束后,在调用异步回调函数通知客户端。

但具体的,同步和阻塞,异步和非阻塞间的区别,分不清,有谁能解惑呢?

解决方案

推荐一篇博文聊聊Linux 五种IO模型,写的很不错。简要的跟你说下这几个。
首先,只有同步才有所谓的阻塞非阻塞,异步并没有。常规的错误理解是,我们觉得异步就是非阻塞的,然而并不是这样的。这里的同步和异步的区别就是,对于一个网络IO或者磁盘IO的整个过程有没有存在阻塞,是整个过程。
以一次read的系统调用为例子,作为一个用户线程,当你发起一次read的系统调用的时候,可以分为两个操作,

  • 一是数据读取:把数据从磁盘读到内核空间,我们都知道,read属于系统调用,用户级线程是无法操作的,只能交给内核线程去处理,而内核线程首先要找到数据,并读到内核空间中。

  • 二是数据复制:把数据从内核空间读取到用户空间。然后用户线程才可以使用这些数据。

所以简单的说,

  • 同步就是上述两个过程都阻塞了,你用户线程一直在等。

  • 非阻塞就是上述第一个过程你没有阻塞,但是用户线程必须不断的询问os,数据是否从磁盘拷贝到内和空间了,如果拷贝好了,则在数据复制的过程阻塞。所以所有的同步过程,在第二阶段都是阻塞的,尽管这是非阻塞的调用。

  • 多路复用:和非阻塞一样,在第二阶段也是阻塞的,但是第一阶段不再由自己去询问操作系统,而是统一交给一个内核线程去处理(linux上实现的有poll,以及改进版的epoll),当你的数据读取完成,这个线程就发送一个信号给原先发起系统调用的用户线程,然后用户线程就进入阻塞,并开始数据拷贝了。

  • 异步:上述两个过程都是非阻塞的。

上述只是简单描述,希望有帮助

这篇关于java - 同步/异步与阻塞/非阻塞之间的差异具体是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆