欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简述JAVA同步、异步、阻塞和非阻塞之间的区别

程序员文章站 2022-07-01 20:19:25
同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。1. 同步和异步同步和异步描述的是消息通信的机制。同步当一个request发送出去以后,会得到一...

同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。

1. 同步和异步

同步和异步描述的是消息通信的机制。

同步

当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或者response的返回特别快,但是针对这一次请求而言就是一个同步的调用。

异步

当一个request发送出去以后,没有得到想要的response,而是通过后面的callback、状态或者通知的方式获得结果。可以这么理解,对于异步请求分两步:

1)调用方发送request没有返回对应的response(可能是一个空的response);

2)服务提供方将response处理完成以后通过callback的方式通知调用方。

对于1)而言是同步操作(调用方请求服务方),对于2)而言也是同步操作(服务方回掉调用方)。从请求的目的(调用方发送一个request,希望获得对应的response)来看,这两个步骤拆分开来没有任何意义,需要结合起来看,而这整个过程就是一次异步请求。异步请求有一个最典型的特点:需要callback、状态或者通知的方式来告知调用方结果。

2. 阻塞和非阻塞

阻塞和非阻塞描述的是程序在等待调用结果(消息,返回值)时的状态。

阻塞

阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起,当服务方得到response后就唤醒挂起线程,并将response返回给调用方。

非阻塞

非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,直到得到response后才返回。

阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。

3. 同步、异步、阻塞和非阻塞io

同步阻塞io

简述JAVA同步、异步、阻塞和非阻塞之间的区别

针对sender而言,请求发送出去以后,一直等到receiver有结果了才返回,这是同步。在sender获取结果的期间一直被block住了,也就是在此期间sender不能处理其它事情,这是阻塞。

异步阻塞io

简述JAVA同步、异步、阻塞和非阻塞之间的区别

针对sender而言,请求发送出去以后,立刻返回,然后再等待receiver的callback,最后再次请求获取response,这整个过程是异步。在sender等待receiver的callback期间一直被block住了,也就是在此期间sender不能处理其它事情,这是阻塞。

同步非阻塞io

简述JAVA同步、异步、阻塞和非阻塞之间的区别

针对sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到receiver处理好结果后,最后一次发请求给receiver才获得response。sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在sender等待receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。

异步非阻塞io

简述JAVA同步、异步、阻塞和非阻塞之间的区别

针对sender而言,请求发送出去以后,立刻返回,然后再等待receiver的callback,最后再次请求获取response,这整个过程是异步。在sender等待receiver的callback期间一直是可以处理其它事情的,这是非阻塞。

总结

  • 同步和异步就看调用方是否需要通过callback、通知或者状态来获取结果
  • 阻塞和非阻塞就看调用方在发送请求后是否block住了

以上就是简述java同步、异步、阻塞和非阻塞之间的区别的详细内容,更多关于java同步、异步、阻塞和非阻塞的区别的资料请关注其它相关文章!