阻塞与非阻塞:线程访问资源,该资源是否准备就绪的一种方式。如果说这个资源没有准备就绪,就会有的两种处理方式。
阻塞:线程会持续等待这个资源处理完毕,直到它响应返回一个结果,这个线程不可以去做其他事情。
图:
非阻塞: 这个线程直接返回一个结果,它不会持续等待这个资源处理完毕在响应,它会去处理别的资源。
图:
同步与异步:它是指访问数据的一种机制。
同步:指主动请求,并且等待我们的IO操作完成之后,它会有一个通知。
图:
异步:指在我们主动请求数据之后呢,继承去处理其他的任务,它可以去发起其他的请求,当我们有很多请求处理完毕之 后,它在逐一通过一种异步的通知的方式来通知你。
图:
那么他们两两组合就可以出现:
BIO:同步阻塞的IO,又称Block IO,是一种非常传统,非常简单的模式,这个线程无法去做其他的操作,但是它 并发处理的能力会非常的低。
图:
如图所示,如果在客户端的数量非常多时候,那么我们Server与Client之间,就会频繁的创建或频繁的销毁之间
的线程 ,那么我们的Server服务器就会有很大的压力,甚至会导致我们的服务器崩溃,所以说这种方式是非常 来老的一种IO流的处理方式。
NIO:同步非租塞IO,New IO(Non-Block IO)
图:
如图,在Client与Server端进行一个通信的时候,我们会使用到一个叫Selector的,可以认为它是一个选择器,它其实就是一个线程,它这个线程会主动的轮询,如果说我们的客户端和服务端要建立连接的时候,它就会进行一个注册,注册完成之后,我们就会有一个叫Channel的东西生成,那么每一个客户端和我们的Selector建立连接之后,都会有一个Channel生成,那么Channel它是一个通道,它是一个双向通道,它可以进行一些相应的数据的读写,那么这些数据的读写,都会到我们缓存区里面去,Channel是非阻塞的读取,Selector是一个单线程,它可以处理成千上万个客户端,客户端的增多,不会影响它的性能,也就是说Channel相当于一个读写的工具,每一个客户端都可以理解为一个单独的Channel, 或者说,每一个客户端和我们服务端建立连接之后,注册完毕之后,就会有一个单独的Channel,它是一个一对一的,每一个Client就会有一个单独的Channel与之对应,然后每一个服务端会有一个Selector, 缓存区里面的数据会用于读写,数据被用于读完之后,这个数据还会存在缓存区内的,它不会因为我们的数据被读取了会后就消失。
AIO: 异步非阻塞
最后简单的用生活实例总结下它们:
图: