一、JAVA中非阻塞IO
同步:指的是用户进程触发IO操作并等待或者轮询地去查看IO操作是否就绪。
异步:是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。
阻塞:指当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,线程就进入等待状态,直到有东西可读或者可写为止。
非阻塞:是指如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。
BIO(同步阻塞IO)
同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。传统的网络连接、Socket采用的就是BIO工作模式,如ServerSocket调用accept方法就会阻塞当前线程。
NIO(同步非阻塞IO)
服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
JAVA中NIO工作流程主要通过Channel(通道)、Buffer(缓存)、Selector(选择区)实现。首先NIO是面向缓存区的,而传统IO是面向流的,且NIO使用的Channel是双向的,即可以用来读又可以写。
JAVA的NIO中提供了SocketChannel、ByteBuffer、ServerSocketChannel、Selector等类实现了客户端和服务器的NIO工作模式。客户端创建SocketChannel和ByteBuffer对象连接到对应主机,通过循环探测缓存区实现发送和数据接收。服务器则创建ServerSocketChannel、SocketChannel、Selector对象,先将Channel注册到Selector上,每次则通过循环遍历Selector获取Set对象得到有效请求、之后则可以派生出子线程针对具体请求进行处理。
AIO(异步非阻塞IO)
服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序。对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
二、链接
ThreadLocal类、Volatile关键字、Synchronized
注解、注解处理器、自定义注解处理器
动态代理、反射基础、反射、反射详解、反射用法