阻塞与非阻塞的概念:
主要指的是访问IO的线程是否回阻塞(等待)
线程访问资源,该资源是否准备接续的一种处理方式
1.当线程去请求资源时如果发生了阻塞,该线程会等待资源就绪,直到可以调用该资资源的行为
2.当线程去请求资源时如果发送了阻塞,该线程不再等待该资源,继续执行其它功能的行为
同步与异步的概念:主要指的是数据的请求方式,同步和异步是指访问数据的一种机制
同步:当数据发送请求进行访问的时候,在获取到返回数据之前会阻塞。
异步:当数据发送请求进行访问的时候,在等待返回数据的同时,可以进行其它操作
同步阻塞IO,Block IO, IO操作时会阻塞线程,并发处理能力低。我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务器不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。
同步非阻塞IO,None-Block IO
NIO是对 BIO的改进,基于Reactor模型,我们知道,一个socket连接只有在特定时候才会发送数据传输IO操作,
大部分事件这个“数据传输”是空闲的,但还是占用着线程,NIO做出的改进就是“一个请求,一个线程”,在连接服务端的众多socket中,只有需要进行IO操作的才能获取服务端的处理线程进行IO,这样及占会因为线程不够用,二限制了socket的接入。
异步非阻塞IO
这种IO模型是由操作系统先完成了客户端请求处理再通知服务器端去启动线程进行处理。AIO也成NIO2.0,再JDK7开始支持。
可以据一个去餐厅吃饭拿号排队的例子来对这三种IO模型进行说明
BIO:你去餐厅吃饭,发现没有位置了,这时候你就只能站在门口等,啥事也不能干
NIO: 你去餐厅吃饭,发现没有位置了,但是贴心的店家给你提供了一些其它的娱乐设施,还有小吃,你可以再等位的同时一边看看电视,做美甲,嗑嗑瓜子
AIO:这家餐厅就更加良心,在你去餐厅之前,一旦它有空虚位置了就会打电话告诉你,这个时候你再去餐厅就不用等待了,直接上菜。。。。
来源:CSDN
作者:林中见山海
链接:https://blog.csdn.net/weixin_44449775/article/details/103639859