目录
首先了解同步和异步,阻塞和非阻塞的概念:
同步:发起请求的一方需要等待操作完成并获得结果后才能继续执行后续的操作,换句话说,同步操作会阻塞当前线程或进程,直到操作完成。
异步:发起请求的一方可以继续执行后续的操作,而不必等待操作完成。异步操作通常会使用回调函数、事件处理器或者轮询的方式来处理结果。在异步模式下,不同的参与方可以独立地进行操作,无需等待其他操作的完成。
阻塞:在阻塞模式下,当一个I/O操作被调用时,程序会一直等待,直到操作完成或者发生错误才会返回结果。在阻塞状态下,调用线程或进程会被挂起,无法进行其他任务,直到I/O操作完成或者超时。
非阻塞:在非阻塞模式下,当一个I/O操作被调用时,程序会立即返回,而不会等待操作完成。如果操作不能立即完成,会返回一个错误或标记来指示当前操作无法立即完成,而不会阻塞调用线程或进程。
阻塞和非阻塞他们描述的是操作等待的状态,同步和异步描述的是操作执行的顺序。
BIO
在没有IO多路复用之前,遇到并发多客户端连接,通常采用 BIO 模型来处理并发多连接问题。
BIO单线程模式
最开始的BIO单线程(同步)模式:
code案例:
public class redisServerBIO {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6379);
while (true) {
System.out.println("模拟RedisServer启动------111等待连接");
Socket accept = serverSocket.accept();
System.out.println("--------222 成功连接:" + IdUtil.simpleUUID());
InputStream inputStream = accept.getInputStream();
int length = -1;
byte[] bytes = new byte[1024];
System.out.println("-------333等待读取");
while ((length = inputStream.read(bytes)) != -1) {
System.out.println("------444 成功读取 " + new String(bytes,0,length));
System.out.println("===================" + "\t" + IdUtil.simpleUUID());
System.out.println();
}
inputStream.close();
accept.close();
}
}
}
存在的问题:如果客户端与服务端建立了连接,但连