成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

還搞不懂Java NIO?快來讀讀這篇文章

開發 后端
首先,我們需要弄清楚幾個概念:同步和異步,阻塞和非阻塞。

 [[316505]]

首先,我們需要弄清楚幾個概念:同步和異步,阻塞和非阻塞。

同步和異步

1. 同步

進程觸發 IO 操作的時候,必須親自處理;

比如你必須親自去銀行取錢。

2. 異步

進程觸發 IO 操作的時候,可以不親自處理,它把操作委托給 OS 處理,委托的時候需要告知數據的地址和大小,然后自己去做別的事情,當 IO 操作結束后會得到通知;
比如你把銀行卡給我,讓我幫你去銀行取錢,你需要告訴我銀行卡密碼和取多少錢,我取完了之后把錢給你。

3. 總結

自己干就是同步,別人干就是異步。

阻塞和非阻塞

1. 阻塞

進程觸發 IO 操作的時候,如果此時此時沒辦法讀或者寫,那么進程就一直等待,直到讀寫結束;

比如你去銀行 ATM 取錢,前面有人在排隊,那么就要一直等待,直到你取完錢;

2. 非阻塞

進程觸發 IO 操作的時候,如果此時此時沒辦法讀或者寫,那么就先去做別的,等到有通知后,再繼續讀寫;

比如你去銀行柜臺取錢,人比較多,那就先領一個號,等著叫到號再去對應的窗口辦理業務;這里稍微有些不太恰當的是,我們等待的過程中,還得聽著叫號。
3. 總結

我要等著不能做其他事就是阻塞,我不用等可以做其他事就是異步。

BIO

同步阻塞;一個請求過來,應用程序開了一個線程,等 IO 準備好,IO 操作也是自己干;

采用 BIO 模型的服務端,由一個獨立的 Acceptor 線程負責進行監聽;在 while(true) 循環中調用 accept() 方法,等待客戶端的請求;

一旦接收到請求,就可以建立套接字開始進行讀寫操作,這時候不再接收其他的請求,直到讀寫完成;

為了讓 BIO 能夠同時處理多個請求,那么就需要使用多線程處理;當服務端接收到請求,就為客戶端創建一個線程進行處理,處理完成后再做線程銷毀;

還搞不懂 Java NIO?快來讀讀這篇文章

不過因為一個請求就要啟動一個線程,所以開銷是比較大的,啟動和銷毀線程開銷很大,而且每個線程都要占用內存,所以可以引入線程池,可以在一定程度上減少線程創建和銷毀的開銷;這也被叫做 偽異步 IO。

還搞不懂 Java NIO?快來讀讀這篇文章

線程池維護著 N 個線程和一個消息隊列;當有請求接入時,服務端將 Socket 作為參數傳遞到一個線程任務中進行處理;通過對線程池最大線程數和消息隊列大小進行控制,所以就算訪問量高于服務端的承載能力,也不會因為服務端的資源耗盡而導致宕機;

這個模型在 請求量不高的時候,效率還是不錯的,而且也不需要考慮限流的問題(控制線程池的最大線程數量)。

NIO

同步非阻塞;不用等待 IO 準備,準備好了會通知,不過 IO 操作還是要自己干;NIO 是一種多路復用機制,利用單線程輪詢事件,Channel 來決定做什么,避免連接數多的時候,頻繁進行線程切換導致性能問題(Select 階段阻塞)。

聽到這里,很多人可能已經懵了...什么是多路復用?Channel又是啥?Select 階段到底是什么階段?這里我用白話解釋一下。

NIO是面向緩沖區的,可以將數據讀取到一個緩沖區,稍后進行處理。NIO 有幾個核心概念:還搞不懂 Java NIO?快來讀讀這篇文章

1. Channel 和 Buffer

Channel 可以理解成一個雙向流,或者理解成一個通道,Buffer 就是緩存區,或者你就把它看做是一塊內存空間,數據可以從 Channel 流進 Buffer ,也可以從 Buffer 流進 Channel 。

Channel 有很多種實現,比如:FileChannel 是從文件中讀寫數據,SocketChannel 通過 TCP 讀寫網絡中的數據等等。

Buffer 也有多重類型,比如:ByteBuffer、CharBuffer、IntBuffer等等,光看他們的名字就知道他們代表了不同的數據類型。

2. Selector

我們可以把 Selector 看做是一個管理員,可以管理多個 Channel , Selector 能夠知道到哪個 Channel 已經做好了讀寫的準備。這樣一個線程只要操作這個管理員就可以了,相當于一個線程可以管理多個 Channel;一旦監聽到有準備好的 Channel,就可以進行相應的處理。

不過 Java 原生的 NIO 不好用,直到 Netty 的出現。

AIO

異步非阻塞;因為事情不是自己做,其實也沒有阻塞一說(都是非阻塞);

AIO 是在 NIO 的基礎上,引入異步通道的概念;NIO 是采用輪詢的方式,不停地詢問數據是否準備好了,準備好了就處理;AIO 是向操作系統注冊 IO 監聽,操作系統完成 IO 操作了之后,主動通知,觸發響應的函數(自己不做,讓操作系統來做)。

目前看,AIO 應該的還不是很廣泛。

看過這篇文章之后,您是否對 BIO、NIO 和 AIO 有了初步的了解呢?

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-10-09 09:49:18

HTTPS網絡 HTTP

2020-02-24 21:50:24

瓶頸數據庫

2020-03-27 11:14:18

IONIOJava

2017-08-09 15:07:08

大數據數據分析戶畫像

2022-02-18 06:56:18

Wi-Fi路由器局域網

2020-11-06 08:36:04

UI設計規范iOS

2019-10-31 09:48:53

MySQL數據庫事務

2022-04-14 10:10:59

Nginx開源Linux

2023-05-08 08:21:15

JavaNIO編程

2024-01-17 08:18:14

RPAJava技術

2017-03-30 22:41:55

虛擬化操作系統軟件

2022-05-20 16:50:33

區塊鏈Web3加密資產

2020-12-21 14:58:25

分布式性能系統

2021-07-13 12:21:34

PythonRPC通信

2017-12-12 12:53:09

2017-03-10 21:04:04

Android適配

2018-04-13 16:24:59

區塊鏈數據庫去中心化

2017-03-07 15:35:26

Android適配 界面

2021-11-10 07:47:48

Traefik邊緣網關

2019-07-10 15:15:23

JVM虛擬機Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频一区二区三区 | av片免费观看 | 欧美精品首页 | 欧美一级淫片免费视频黄 | 中文字幕欧美一区 | 亚洲性人人天天夜夜摸 | 国产在线一区二区三区 | 在线观看视频你懂得 | 国产欧美日韩在线一区 | 国产精品一区二区视频 | 日韩成人性视频 | 精品久久久久久久 | 成人免费视频观看视频 | 91精品久久久久久久久久入口 | 亚洲综合一区二区三区 | 华丽的挑战在线观看 | 成人免费视频 | 97伊人 | 第一福利社区1024 | 国产精品久久久久久久久久久免费看 | 91一区二区三区在线观看 | 91精品国产欧美一区二区成人 | 国产高清在线观看 | 一区二区三区国产精品 | 日操操| 97人澡人人添人人爽欧美 | 国产视频1区2区 | 在线观看黄色电影 | 国产欧美日韩 | 成年人免费网站 | 一区二区三区国产在线观看 | 午夜影院网站 | 国产成人小视频 | 久久国产综合 | 亚洲男人天堂 | 亚洲高清网| 成人欧美一区二区三区色青冈 | 国产欧美视频一区 | 亚洲欧美在线观看 | 中文字幕第九页 | 一区二区成人 |