同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO之间的区别是什么?

这些术语描述了IO操作(如读取和写入数据)与程序执行流之间的关系,以及这些操作是如何影响程序的继续执行的。

  1. 同步阻塞IO (Synchronous Blocking IO):
    • 同步意味着IO操作的发起和完成是连续的,调用者发起一个操作后必须等待操作完成后才能继续执行。
    • 阻塞指的是在IO操作正在进行时,如果数据未准备好,调用者会被阻塞,即线程挂起直到数据可用为止。
    • 例子: 传统的Java IO流(java.io包下的类),如FileInputStream读文件时,如果文件没有内容可读,调用者线程会阻塞在那里等待。
  2. 同步非阻塞IO (Synchronous Non-Blocking IO):
    • 依旧是同步的,因为IO的请求和处理是顺序发生的。
    • 非阻塞意味着如果IO操作不能立即完成(比如数据还不可用),调用者不会阻塞等待,而是立即得到一个状态指示,可以决定后续操作。
    • 例子: Java NIO中的SocketChannel在配置为非阻塞模式时,当你试图从中读取数据,而数据尚未到达,它不会挂起调用者线程,而是立即返回,告知目前没有数据。
  3. 异步阻塞IO (Asynchronous Blocking IO):
    • 这种类型的IO不常见,异步指的是IO操作的发起和完成是分离的,调用者发起操作后可以做其他事情,当IO操作完成后会收到通知。
    • 然而,如果使用的异步API在等待操作完成时造成了调用者阻塞,这便是阻塞的表现。
    • 实际中,人们很少谈及异步阻塞IO,因为异步通常意味着非阻塞。
  4. 异步非阻塞IO (Asynchronous Non-Blocking IO):
    • 异步意味着IO操作的请求和完成是解耦的,调用者请求IO操作后无需等待,可以继续执行其他任务。
    • 非阻塞意味着调用者不会因为IO操作在等待数据时而挂起。
    • 例子: Java的AsynchronousFileChannel允许你启动一个读操作,然后立即做其他事情。当数据读取完成,你可以通过一个回调、Future或CompletionHandler得到通知。

总结:

  • 同步IO中,“同步”意味着调用者必须等待IO操作的完成才能继续执行。
  • 阻塞IO中,“阻塞”意味着如果IO操作不能立即完成,调用者线程将被挂起。
  • 异步IO中,“异步”意味着调用者可以请求IO操作然后立即继续执行,IO操作完成后会通知调用者。
  • 非阻塞IO中,“非阻塞”意味着调用者请求IO操作如果不能立即完成,调用者也不会挂起,而是可以立即知道这一状态。

发表评论

后才能评论