1、同步概念:
- 同步﹔自己亲自出马持银行卡到银行取钱(使用同步l0时,Java自己处理l0读写)。
- 异步:委托一小弟拿银行卡到银行取钱,然后给你(使用异步lo时,Java将lo读写委托给OS处理,需要将数据缓冲区地址和大小传给oS(银行卡和密码),oS需要支持异步lIo操作API)。
- 阻塞 :ATM排队取款,你只能等待(使用阻塞lo时,Java调用会一直阻塞到读写完成才返回)。
- 非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞lO时,如果不能读写Java调用会马上返回,当lo事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)。
2、Java对BIO、NIO、AIO的支持:
- Java Blo :同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
- Java NlO :同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有\/o请求时才启动一个线程进行处理。
- Java AIO(NIO.2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
3、BIO、NIO、AIO适用场景分析:
- BIO:::BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解,性能非常低下,没有经过任何优化处理和支持。
- NIO:::Nio(new1/O),是java SE1.4及后续版本提供的一种新的l/o操作方式(即 java.nio.包及其子包)。Java ni。是一个基于缓冲区,并能提供非阻塞l/o操作的java APl,因此nio.也被看成是non-blocking l/o 的缩写。它拥有比传统I/o操作(bio)更好的并发运行性能。适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中。
- APR:::安装起来最困难,但是从操作系统级别来解决异步的Io问题,大幅度的提高了性能