Java高頻面試之SE-18

hello啊,各位觀眾姥爺們!!!本baby今天又來了!哈哈哈哈哈嗝🐶

BIO NIO AIO的區別?

在 Java 網絡編程中,BIONIOAIO 是三種不同的 I/O 模型,它們的核心區別在于 阻塞與非阻塞同步與異步 的實現方式以及對系統資源的利用效率。


1. BIO(Blocking I/O,阻塞式 I/O)

核心特點

  • 同步阻塞模型:線程在讀寫數據時會被阻塞,直到操作完成。
  • 一連接一線程:每個客戶端連接需要獨立的線程處理,線程資源消耗大。
  • 簡單直觀:代碼實現簡單,適合低并發場景。

工作流程

  1. 服務端監聽端口,等待客戶端連接(ServerSocket.accept() 會阻塞線程)。
  2. 客戶端連接后,服務端為每個連接創建一個新線程處理讀寫(Socket.getInputStream().read() 也會阻塞線程)。
  3. 線程在讀寫數據時無法處理其他任務,資源利用率低。

適用場景

  • 客戶端連接數較少(如傳統單機應用)。
  • 開發簡單,適合快速驗證邏輯。

缺點

  • 高并發時線程數暴增,導致線程切換開銷大,甚至內存溢出。
  • 資源浪費嚴重,線程大部分時間在等待 I/O 操作。

2. NIO(Non-blocking I/O,同步非阻塞 I/O)

核心特點

  • 同步非阻塞模型:線程通過輪詢檢查 I/O 操作是否就緒,不會一直阻塞。
  • 多路復用(Selector):單線程可管理多個連接通道(Channel),通過事件驅動處理 I/O。
  • 面向緩沖區(Buffer):數據通過 Buffer 讀寫,減少直接操作流的開銷。

工作流程

  1. 服務端通過 Selector 監聽多個 Channel 的事件(如連接、讀、寫)。
  2. 當某個 Channel 有事件就緒時,Selector 通知線程處理,線程不會阻塞。
  3. 通過 Buffer 批量讀寫數據,提高效率。

適用場景

  • 高并發場景(如即時通信、游戲服務器)。
  • 需要高效管理大量長連接的應用。

優點

  • 減少線程數量,通過事件驅動提高資源利用率。
  • 支持單線程處理多個連接,避免線程切換開銷。

缺點

  • 編程復雜度高(需處理 SelectorBufferChannel 的關系)。
  • 需要處理粘包/拆包問題,邏輯復雜。

3. AIO(Asynchronous I/O,異步非阻塞 I/O)

核心特點

  • 異步非阻塞模型:I/O 操作由操作系統完成后,通過回調機制通知應用。
  • Proactor 模式:應用發起 I/O 請求后立即返回,由操作系統完成實際讀寫并通知結果。
  • 零阻塞:應用線程無需等待 I/O 操作。

工作流程

  1. 應用發起異步 I/O 操作(如 AsynchronousServerSocketChannel.accept())。
  2. 操作系統完成 I/O 操作(如數據讀取)后,通過回調函數(CompletionHandler)通知應用。
  3. 應用線程繼續處理其他任務,無需等待。

適用場景

  • 高吞吐量、長延遲的 I/O 密集型應用(如文件傳輸)。
  • 需要完全異步處理 I/O 的場景。

優點

  • 徹底避免線程阻塞,資源利用率最高。
  • 簡化高并發編程模型。

缺點

  • 實現復雜,調試困難(回調地獄問題)。
  • 依賴操作系統支持(如 Linux 對 AIO 的支持不完善)。
  • 實際應用中較少使用(NIO 更成熟)。

三者的核心對比

特性BIONIOAIO
阻塞/非阻塞阻塞非阻塞非阻塞
同步/異步同步同步異步
線程模型一連接一線程單線程處理多連接(多路復用)操作系統完成 I/O,回調通知
編程復雜度簡單復雜非常復雜
資源消耗高(線程多)低(線程少)極低
適用場景低并發、短連接高并發、長連接高吞吐、異步處理

選擇建議

  1. BIO:適合簡單應用或學習 I/O 模型的基礎原理。
  2. NIO:高并發場景的默認選擇(如 Netty 框架基于 NIO)。
  3. AIO:在特定場景下(如文件操作)可能更高效,但需注意操作系統兼容性。

demo

BIO 的簡單實現
// 服務端代碼
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {Socket socket = serverSocket.accept(); // 阻塞new Thread(() -> {// 處理讀寫(read() 會阻塞)}).start();
}
NIO 的核心組件
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select(); // 非阻塞,返回就緒的 ChannelSet<SelectionKey> keys = selector.selectedKeys();// 處理連接、讀、寫事件...
}
AIO 的回調機制
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(8080));
server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel client, Void attachment) {// 處理客戶端連接ByteBuffer buffer = ByteBuffer.allocate(1024);client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer buffer) {// 處理讀取的數據}});}
});

總的來說

  • BIO 的阻塞模型簡單但性能差,適合低并發場景。
  • NIO 通過多路復用和事件驅動實現高并發,是主流選擇。
  • AIO 理論上性能最優,但受限于實現復雜性和操作系統支持,實際使用較少。

IDEA ji huo
https://pan.quark.cn/s/4216736c0427
最新🎬大全(唐探)
https://kdocs.cn/l/cqhxNU9I2lLD

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/68171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/68171.shtml
英文地址,請注明出處:http://en.pswp.cn/web/68171.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯刷題DAY3:Horner 法則 前綴和+差分數組 貪心

所謂刷題&#xff0c;最重要的就是細心 &#x1f4cc; 題目描述 在 X 進制 中&#xff0c;每一數位的進制不固定。例如&#xff1a; 最低位 采用 2 進制&#xff0c;第二位 采用 10 進制&#xff0c;第三位 采用 8 進制&#xff0c; 則 X 進制數 321 的十進制值為&#xff…

BUU24 [GXYCTF2019]BabyUpload 1

開局上傳文件 上傳muma.php 上傳.htaccess文件也被打回 再次求助互聯網&#xff0c;才發現這提示給的多么明顯&#xff0c;上傳.htaccess文件是檢查文件類型&#xff08;Contnet-Type&#xff09;&#xff0c;上傳muma.php是檢查后綴里頭有沒有ph &#xff0c;檢查文件類型那…

RabbitMQ 從入門到精通:從工作模式到集群部署實戰(三)

文章目錄 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安裝兼容的 Erlang/OTP版本。 這些工具假定系統區域設置為 UTF-8&#xff08;例如en…

3.攻防世界 weak_auth

題目描述提示 是一個登錄界面&#xff0c;需要密碼登錄 進入題目頁面如下 弱口令密碼爆破 用1 or 1 #試試 提示用admin登錄 則嘗試 用戶名admin密碼&#xff1a;123456 直接得到flag 常用弱口令密碼&#xff08;可復制&#xff09; 用戶名 admin admin-- admin or -- admin…

優化深度神經網絡

訓練集、開發集(驗證集)、測試集 偏差與方差 正則化 L2正則 Dropout 隨機丟棄部分神經元輸入&#xff0c;經常用于計算機視覺的神經網絡內&#xff0c;因為通常沒有足夠的訓練數據&#xff0c;很容易出現過擬合的問題 數據增強 訓練集規一化 可以使其圖像更均勻&#xff0c;…

【玩轉 Postman 接口測試與開發2_018】第14章:利用 Postman 初探 API 安全測試

《API Testing and Development with Postman》最新第二版封面 文章目錄 第十四章 API 安全測試1 OWASP API 安全清單1.1 相關背景1.2 OWASP API 安全清單1.3 認證與授權1.4 破防的對象級授權&#xff08;Broken object-level authorization&#xff09;1.5 破防的屬性級授權&a…

Spring @PropertySource:讓你的應用配置更加模塊化和可維護

PropertySource注解在Spring中的作用&#xff0c;就像是給Spring應用配了一個“外部配置箱”。 想象一下&#xff0c;你在開發一個Spring應用時&#xff0c;有很多配置信息需要設置&#xff0c;比如數據庫的連接信息、應用的某些功能開關等。如果這些信息都硬編碼在代碼中&…

RK3576——USB3.2 OTG無法識別到USB設備

問題&#xff1a;使用硬盤接入到OTG接口無熱插拔信息&#xff0c;接入DP顯示屏無法正常識別到顯示設備&#xff0c;但是能通過RKDdevTool工具燒錄系統。 問題分析&#xff1a;由于熱插拔功能實現是靠HUSB311芯片完成的&#xff0c;因此需要先確保HUSB311芯片驅動正常工作。 1. …

docker-compose 配置nginx

前言 前端打包的dist文件在宿主機&#xff0c;nginx運行在docker-compose 問題 nginx.conf 在本地配置可以生效&#xff0c;但是鏈接到容器就報錯 基于本地的nginx運行&#xff0c;本地nginx.conf 如下 server {listen 8081;location / {root /usr/local/software/testweb/…

基于SpringBoot+ Vue的家教管理系統

隨著互聯網技術的發展&#xff0c;信息化管理已經深入到各個行業中。在教育領域&#xff0c;家教管理系統的需求日益增長。傳統的手工管理方式在面對大量信息時&#xff0c;容易出現管理效率低下、數據錯誤率高、修改困難等問題。本文將介紹基于Spring Boot框架、MySQL數據庫開…

【數據結構】樹哈希

目錄 一、樹的同構1. 定義2. 具體理解(1) 結點對應(2) 孩子相同(3) 遞歸性質 3. 示例 二、樹哈希1.定義2.哈希過程&#xff08;1&#xff09;葉節點哈希&#xff08;2&#xff09;非葉節點哈希&#xff08;3&#xff09;組合哈希值 3.性質&#xff08;1&#xff09; 唯一性 \re…

使用DeepSeek的技巧筆記

來源&#xff1a;新年逼自己一把&#xff0c;學會使用DeepSeek R1_嗶哩嗶哩_bilibili 前言 對于DeepSeek而言&#xff0c;我們不再需要那么多的提示詞技巧&#xff0c;但還是要有兩個注意點&#xff1a;你需要理解大語言模型的工作原理與局限,這能幫助你更好的知道AI可完成任務…

【工具篇】ChatGPT:開啟人工智能新紀元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒體界,還是咱們普通人的日常聊天里,都能聽到它的大名。好多人都在討論,這 ChatGPT 到底是個啥 “神器”,能讓大家這么著迷?今天咱就好好嘮嘮。 ChatGPT,全稱是 Chat Generative Pre-trained Trans…

【centOS】搭建公司內網git環境-GitLab 社區版(GitLab CE)

1. 安裝必要的依賴 以 CentOS 7 系統為例&#xff0c;安裝必要的依賴包&#xff1a; sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 倉庫 curl -sS https:/…

$route 和 $router 的區別是什么?

在 Vue Router 中,$route 和 $router 是兩個不同的對象,它們各自承擔著不同的角色。下面是它們的主要區別: 一、$route 定義$route 是當前路由的信息對象,包含了與當前路由相關的狀態和參數。它是一個只讀對象。 2. 主要屬性 params:動態路由參數,例如 /user/:id 中的 …

node.js 08 express的使用和熱重載nodemon的安裝

一.express的安裝和使用 安裝 npm i express 使用 //引入express const express require(express)//啟動服務器 const app express()//設置get請求地址&#xff0c;獲取請求地址信息&#xff0c;和發送返回的數據 app.get(/bailan,(req, res) > {//req.query可以獲取到客…

Python因為網絡原因安裝依賴庫報錯

現象 在終端運行以下指令 pip install pyautogui pillow keyboard 出現報錯&#xff0c;終端信息如下&#xff1a; PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…

面試問題記錄1

問題一&#xff1a;性能測試步驟 性能測試步驟主要包括以下幾個階段&#xff1a; ?1. 需求分析階段? 明確測試目標&#xff0c;了解性能測試需求&#xff0c;包括業務列表、性能指標、測試環境、數據量等詳細需求?12。熟悉項目相關的資源&#xff0c;如架構設計、軟硬件環…

開源 GPU 集群管理器 GPUStack 輕松拉起deepseek各版本模型

GPUStack 是一個用于運行 AI 模型的開源 GPU 集群管理器。 項目地址&#xff1a;gpustack/gpustack: Manage GPU clusters for running AI modelshttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://githu…

ESP32開發學習記錄---》GPIO

she 2025年2月5日&#xff0c;新年后決定開始充電提升自己&#xff0c;故作此記,以前沒有使用過IDF開發ESP32因此新年學習一下ESP32。 ESPIDF開發環境配置網上已經有很多的資料了&#xff0c;我就不再贅述&#xff0c;我這里只是對我的學習經歷的一些記錄。 首先學習一個…