網路應用可採同步阻塞 I/O 或非阻塞 I/O 兩種模型,二者非互斥可混用。本文解析非阻塞 I/O 的定義、運作機制,並從執行緒模型、資源消耗、適用場景三維度說明其在高併發下的核心優勢。
connect、read、write、accept 等操作未完成前,當前執行緒持續等待(阻塞),除非發生超時例外。java.nio 套件提供完整 API,核心三大組件:緩衝區、通道、選擇器。同步模型下,每個客戶端連接需一執行緒處理。大量連接導致執行緒爆增,消耗記憶體並受 OS 執行緒數上限制約,易造成伺服器拒絕服務或癱瘓。執行緒池只能緩解,無法根治。
非阻塞模型通常單執行緒運行(或將 NIO 部分放入獨立執行緒),連接數不等於執行緒數。選擇器輪詢就緒通道,同一執行緒可服務成千上萬連接,不受 OS 執行緒上限約束,記憶體佔用極低。
非阻塞 I/O 以「單執行緒 + 事件多路複用」解決高併發下的執行緒瓶頸,是現代高效能網路伺服器(Netty、Jetty、Nginx 等)的基石。但並非銀彈,需根據業務特性(連接時長、狀態保持、資料量)權衡選型。