自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

 [[316505]]

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

同步和異步

1. 同步

進(jìn)程觸發(fā) IO 操作的時(shí)候,必須親自處理;

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

2. 異步

進(jìn)程觸發(fā) IO 操作的時(shí)候,可以不親自處理,它把操作委托給 OS 處理,委托的時(shí)候需要告知數(shù)據(jù)的地址和大小,然后自己去做別的事情,當(dāng) IO 操作結(jié)束后會(huì)得到通知;
比如你把銀行卡給我,讓我?guī)湍闳ャy行取錢,你需要告訴我銀行卡密碼和取多少錢,我取完了之后把錢給你。

3. 總結(jié)

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

阻塞和非阻塞

1. 阻塞

進(jìn)程觸發(fā) IO 操作的時(shí)候,如果此時(shí)此時(shí)沒辦法讀或者寫,那么進(jìn)程就一直等待,直到讀寫結(jié)束;

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

2. 非阻塞

進(jìn)程觸發(fā) IO 操作的時(shí)候,如果此時(shí)此時(shí)沒辦法讀或者寫,那么就先去做別的,等到有通知后,再繼續(xù)讀寫;

比如你去銀行柜臺(tái)取錢,人比較多,那就先領(lǐng)一個(gè)號(hào),等著叫到號(hào)再去對(duì)應(yīng)的窗口辦理業(yè)務(wù);這里稍微有些不太恰當(dāng)?shù)氖?,我們等待的過程中,還得聽著叫號(hào)。
3. 總結(jié)

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

BIO

同步阻塞;一個(gè)請(qǐng)求過來,應(yīng)用程序開了一個(gè)線程,等 IO 準(zhǔn)備好,IO 操作也是自己干;

采用 BIO 模型的服務(wù)端,由一個(gè)獨(dú)立的 Acceptor 線程負(fù)責(zé)進(jìn)行監(jiān)聽;在 while(true) 循環(huán)中調(diào)用 accept() 方法,等待客戶端的請(qǐng)求;

一旦接收到請(qǐng)求,就可以建立套接字開始進(jìn)行讀寫操作,這時(shí)候不再接收其他的請(qǐng)求,直到讀寫完成;

為了讓 BIO 能夠同時(shí)處理多個(gè)請(qǐng)求,那么就需要使用多線程處理;當(dāng)服務(wù)端接收到請(qǐng)求,就為客戶端創(chuàng)建一個(gè)線程進(jìn)行處理,處理完成后再做線程銷毀;

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

不過因?yàn)橐粋€(gè)請(qǐng)求就要啟動(dòng)一個(gè)線程,所以開銷是比較大的,啟動(dòng)和銷毀線程開銷很大,而且每個(gè)線程都要占用內(nèi)存,所以可以引入線程池,可以在一定程度上減少線程創(chuàng)建和銷毀的開銷;這也被叫做 偽異步 IO。

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

線程池維護(hù)著 N 個(gè)線程和一個(gè)消息隊(duì)列;當(dāng)有請(qǐng)求接入時(shí),服務(wù)端將 Socket 作為參數(shù)傳遞到一個(gè)線程任務(wù)中進(jìn)行處理;通過對(duì)線程池最大線程數(shù)和消息隊(duì)列大小進(jìn)行控制,所以就算訪問量高于服務(wù)端的承載能力,也不會(huì)因?yàn)榉?wù)端的資源耗盡而導(dǎo)致宕機(jī);

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

NIO

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

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

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

1. Channel 和 Buffer

Channel 可以理解成一個(gè)雙向流,或者理解成一個(gè)通道,Buffer 就是緩存區(qū),或者你就把它看做是一塊內(nèi)存空間,數(shù)據(jù)可以從 Channel 流進(jìn) Buffer ,也可以從 Buffer 流進(jìn) Channel 。

Channel 有很多種實(shí)現(xiàn),比如:FileChannel 是從文件中讀寫數(shù)據(jù),SocketChannel 通過 TCP 讀寫網(wǎng)絡(luò)中的數(shù)據(jù)等等。

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

2. Selector

我們可以把 Selector 看做是一個(gè)管理員,可以管理多個(gè) Channel , Selector 能夠知道到哪個(gè) Channel 已經(jīng)做好了讀寫的準(zhǔn)備。這樣一個(gè)線程只要操作這個(gè)管理員就可以了,相當(dāng)于一個(gè)線程可以管理多個(gè) Channel;一旦監(jiān)聽到有準(zhǔn)備好的 Channel,就可以進(jìn)行相應(yīng)的處理。

不過 Java 原生的 NIO 不好用,直到 Netty 的出現(xiàn)。

AIO

異步非阻塞;因?yàn)槭虑椴皇亲约鹤觯鋵?shí)也沒有阻塞一說(都是非阻塞);

AIO 是在 NIO 的基礎(chǔ)上,引入異步通道的概念;NIO 是采用輪詢的方式,不停地詢問數(shù)據(jù)是否準(zhǔn)備好了,準(zhǔn)備好了就處理;AIO 是向操作系統(tǒng)注冊(cè) IO 監(jiān)聽,操作系統(tǒng)完成 IO 操作了之后,主動(dòng)通知,觸發(fā)響應(yīng)的函數(shù)(自己不做,讓操作系統(tǒng)來做)。

目前看,AIO 應(yīng)該的還不是很廣泛。

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

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-10-09 09:49:18

HTTPS網(wǎng)絡(luò) HTTP

2020-02-24 21:50:24

瓶頸數(shù)據(jù)庫

2020-03-27 11:14:18

IONIOJava

2017-08-09 15:07:08

大數(shù)據(jù)數(shù)據(jù)分析戶畫像

2022-02-18 06:56:18

Wi-Fi路由器局域網(wǎng)

2020-11-06 08:36:04

UI設(shè)計(jì)規(guī)范iOS

2023-05-08 08:21:15

JavaNIO編程

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫事務(wù)

2022-04-14 10:10:59

Nginx開源Linux

2024-01-17 08:18:14

RPAJava技術(shù)

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2022-05-20 16:50:33

區(qū)塊鏈Web3加密資產(chǎn)

2020-12-21 14:58:25

分布式性能系統(tǒng)

2017-03-10 21:04:04

Android適配

2017-12-12 12:53:09

2021-07-13 12:21:34

PythonRPC通信

2018-04-13 16:24:59

區(qū)塊鏈數(shù)據(jù)庫去中心化

2017-03-07 15:35:26

Android適配 界面

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)

2020-04-28 09:15:58

HashMapJava數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)