说明:接触netty后,对同步、异步,阻塞、非阻塞有了新的认识,所以记录如下,供自己参考。
一、IO中的阻塞、非阻塞、同步、异步:
1、同步与异步:
同步请求:A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
2、阻塞与非阻塞:
阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干。
非阻塞请求:A调用B,A不用一直等着B的返回,先去忙别的事情了。
3、阻塞、非阻塞和同步、异步的区别:
区别:阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
二、Java中的IO:
1、三种IO的解释:
Java BIO:全称Block-IO ,是一种同步且阻塞的通信模式。
Java NIO:全称Non-Block IO ,是Java SE 1.4版以后,针对网络传输效能优化的新功能。是一种非阻塞同步的通信模式。
Java AIO:全称Asynchronous IO,是异步非阻塞的IO,是一种非阻塞异步的通信模式。
2、以烧水为例:
BIO (Blocking I/O):有一排水壶在烧开水,BIO的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
NIO (New I/O):NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
AIO ( Asynchronous I/O):为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
三、Linux的五种IO模型:
Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的。
Linux 2.6以后,Java中NIO和AIO都是通过epoll来实现的,而在Windows上,AIO是通过IOCP来实现的。
Java中的BIO、NIO和AIO理解为是Java语言对操作系统的各种IO模型的封装。
1、分类:
- 阻塞IO模型
- 非阻塞IO模型
- IO复用模型
- 信号驱动IO模型
- 异步IO模型
2、区别:
3、同步与异步的区别:
以钓鱼为例:
我们钓鱼的时候,采用一种高科技钓鱼竿,即全自动钓鱼竿。可以自动感应鱼上钩,自动收竿,更厉害的可以自动把鱼放进鱼篓里。然后,通知我们鱼已经钓到了,他就继续去钓下一条鱼去了。这是异步处理。
需要人为的处理,如将鱼放入鱼篓中。这是同步处理。
以上内容来源:从漫话编程中总结。