广告
返回顶部
首页 > 资讯 > 精选 >java 中同步、异步、阻塞和非阻塞区别详解
  • 451
分享到

java 中同步、异步、阻塞和非阻塞区别详解

java同步异步 2023-05-31 15:05:29 451人浏览 薄情痞子
摘要

java 中同步、异步、阻塞和非阻塞区别详解简单点说:阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。我们拿最常用的send和recv两个函数来说吧.

java 中同步、异步、阻塞和非阻塞区别详解

简单点说:

阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回;

非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。

我们拿最常用的send和recv两个函数来说吧...

比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到tcp/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的Socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."

对于recv函数,同样道理,该函数的内部工作机制其实是在等待TCP/IP协议栈的接收缓冲区通知它说:嗨,你的数据来了.对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头在来看看"

扩展:

在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。

1、同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。

2、异步

异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以向下运行。当连接真正建立起来以后,socket底 层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供 多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循 环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知 没太多区别。

3、阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

4、非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

对象的阻塞模式和阻塞函数调用

对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的api去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

--结束END--

本文标题: java 中同步、异步、阻塞和非阻塞区别详解

本文链接: https://www.lsjlt.com/news/226870.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java 中同步、异步、阻塞和非阻塞区别详解
    java 中同步、异步、阻塞和非阻塞区别详解简单点说:阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。我们拿最常用的send和recv两个函数来说吧....
    99+
    2023-05-31
    java 同步 异步
  • 同步异步,阻塞非阻塞
    众所周知JavaScript的执行环境是单线程的,当有多任务时,先执行前面的任务再按顺序狮子那个后面一个,如果前面一个任务耗时很长,那么多所有任务都将拖延,比如经常遇到的浏览器无响应其实就是因为某一段JavaScript代码长时间运行(死循...
    99+
    2023-06-03
  • 同步、异步与阻塞、非阻塞
    1. 同步与异步   同步和异步关注的是消息通信机制。同步就是在发出一个【调用】时,在没有拿到结果之前,该【调用】就不返回,但是一旦调用返回,就得到返回值了。   换句话说,就是由【调用者】主动等待这个【调用】的结果。     而异步正好...
    99+
    2023-01-31
  • 一篇文章理解阻塞、非阻塞、同步、异步
    目录理解阻塞、非阻塞、同步、异步阻塞非阻塞同步异步总结理解阻塞、非阻塞、同步、异步 首先说明,这些都是在特点场景下或者相对情况的词汇,OK,接下来开门见山。 阻塞 可以很直观的理解,...
    99+
    2022-11-12
  • Python中的同步异步阻塞与非阻塞是什么
    今天小编给大家分享一下Python中的同步异步阻塞与非阻塞是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、状态介绍在...
    99+
    2023-07-05
  • 对于同步、异步、阻塞、非阻塞的几点浅薄理
    首先我们先来看看: 一、同步与异步同步/异步, 它们是消息的通知机制(都是通过状态、通知、回调函数来返回结果)1. 概念解释    同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 (按照这个定义,其实绝大多数...
    99+
    2023-01-30
    几点 浅薄
  • 【JAVA基础】- 同步非阻塞模式NIO详解
    【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 ...
    99+
    2023-09-03
    java nio
  • 浅谈Java非阻塞同步机制和CAS
    目录什么是非阻塞同步悲观锁和乐观锁CAS什么是非阻塞同步 非阻塞同步的意思是多个线程在竞争相同的数据时候不会发生阻塞,从而能够在更加细粒度的维度上进行协调,从而极大的减少线程调度的开...
    99+
    2022-11-12
  • Java非阻塞IO和异步IO的详细介绍
    这篇文章主要讲解了“Java非阻塞IO和异步IO的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java非阻塞IO和异步IO的详细介绍”吧!阻塞模式 IO我们已经介绍过使用 Java...
    99+
    2023-06-02
  • 非阻塞同步怎么在Java中应用
    非阻塞同步怎么在Java中应用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、从硬件原语上理解同步(非特指Java)同步机制是多处理机系统的重要组成部分,其实现方式除了关系到...
    99+
    2023-06-15
  • Python 异步之非阻塞流使用示例详解
    目录1. 异步流2. 如何打开连接3. 如何启动服务器4. 如何使用 StreamWriter 写入数据5. 如何使用 StreamReader 读取数据6. 如何关闭连接1. 异步...
    99+
    2023-03-22
    Python 异步非阻塞流 Python 异步
  • 带你了解Nodejs中的非阻塞异步IO
    以上就是带你了解Nodejs中的非阻塞异步IO的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    I/O模型 node
  • Nodejs中的非阻塞异步IO是什么
    这篇文章主要讲解了“Nodejs中的非阻塞异步IO是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nodejs中的非阻塞异步IO是什么”吧!我们以网络请求IO为例,首先介绍服务端处理一次...
    99+
    2023-07-04
  • 如何在python中实现异步非阻塞
    这篇文章给大家介绍如何在python中实现异步非阻塞,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、说明当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用...
    99+
    2023-06-15
  • Java异步非阻塞编程的方式有哪些
    这篇文章主要讲解了“Java异步非阻塞编程的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java异步非阻塞编程的方式有哪些”吧!1 服务端执行,最简单的同步调用方式:缺陷:服务端...
    99+
    2023-06-20
  • Python异步在非阻塞子进程中运行命令详解
    目录1. 什么是 asyncio.subprocess.Process2. 如何直接运行命令2.1. 如何使用 Asyncio create_subprocess_exec()2.2...
    99+
    2023-03-22
    Python非阻塞命令运行 Python 异步
  • Java异步非阻塞编程的几种方式总结
    1 服务端执行,最简单的同步调用方式: 缺陷: 服务端响应之前,IO会阻塞在: java.net.SocketInputStream#socketRead0...
    99+
    2022-11-12
  • 浅析从同步原语看非阻塞同步以及Java中的应用
    目录一、从硬件原语上理解同步(非特指Java)1.1、基本硬件原语1.2、用一致性实现锁1.3、使用上面的旋转锁实现我们一个同步原语——栅栏同步二、Java中的原子性操作概述三、Ja...
    99+
    2022-11-12
  • Java线程同步中怎么排除阻塞
    这篇文章将为大家详细讲解有关Java线程同步中怎么排除阻塞,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java线程同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访...
    99+
    2023-06-17
  • Python 异步之在 Asyncio中如何运行阻塞任务详解
    目录正文1. 阻塞任务2. 如何运行阻塞任务3. 实例正文 阻塞任务是阻止当前线程继续进行的任务。 如果在 asyncio 程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其...
    99+
    2023-03-22
    Python 异步Asyncio阻塞运行 Python 异步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作