簡體   English   中英

Java IO是阻塞IO嗎?

[英]Is Java IO a blocking IO?

我知道對於一個線程(一個套接字),我不能同時執行read()或write(),或者我可以嗎?

但是如果我創建2個線程並且每個線程分別處理read()和write()怎么辦? 我不知道在低級別視圖中,read()和write()是否會獲得套接字鎖定,因此一次只允許執行一個操作? 會嗎?

我使用Window作為平台,還想知道Unix機器有什么不同嗎?

我問這個問題,因為我很困惑,為什么我們需要非阻塞IO,因為2個線程能夠同時讓我們read()和write()?

我知道對於一個線程(一個套接字),我不能同時執行read()或write(),或者我可以嗎?

當然不是。 一個線程一次只能調用一個方法。 這個問題毫無意義。

但是如果我創建2個線程並且每個線程分別處理read()和write()怎么辦? 我不知道在低級別視圖中,read()和write()是否會獲得套接字鎖定,因此一次只允許執行一個操作? 會嗎?

他們不需要鎖。 TCP是全雙工的。 您可以在同一個套接字上讀寫。 與此同時。

我使用Window作為平台,還想知道Unix機器有什么不同嗎?

沒有。

我問這個問題,因為我很困惑,為什么我們需要非阻塞IO,因為2個線程能夠同時讓我們read()和write()?

下定決心。 首先你問是否有可能,現在你(正確地)說出來了。

NIO允許您在同一個線程中處理多個套接字 這樣做的目的是保護線程,例如在必須處理數十萬個連接的服務器中。

線程是非常昂貴的資源。 我們應該盡量有效地使用它們來充分利用它們。

NIO允許我們在同一個線程上打開多個套接字。 基本上你可以在一個線程而不是1000個線程上使用1000個套接字連接。

讓我們把Tomcat作為一個真實世界的例子。 Tomcat是一個帶有JSP / Servlet容器的Web服務器。 它支持阻塞IO和非阻塞IO。 使用阻塞IO,它最多可以使用5K HTTP連接,但是對於NIO,當有足夠的RAM內存時,它可以達到20K HTTP連接。

因為創建數千個線程會給JVM和系統資源帶來壓力。 使用異步IO,您可以讓一些線程監視大量連接,並且效率更高。

對於一個線程(一個套接字),我不能同時執行read()或write(),

您可以同時讀寫,但可以在同一個線程中讀寫。 如果您希望編寫已知數量的數據或消息,並且希望獲得已知數量的數據或消息,則可以在同一個線程中編寫然后讀取。

例如,如果您有一個簡單的服務器進程,您可以使用單個線程讀取請求並寫入響應。

我會使用阻塞IO不超過幾百個連接。 如果您有數十個或更少的連接,非阻塞IO可能不值得額外的復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM