天天看點

java轉義字元的使用和功能,砥砺前行!

Java BIO 問題分析

  1. 每個請求都需要建立獨立的線程,與對應的用戶端進行資料 Read,業務處理,資料 Write 。
  2. 當并發數較大時,需要建立大量線程來處理連接配接,系統資源占用較大。
  3. 連接配接建立後,如果目前線程暫時沒有資料可讀,則線程就阻塞在 Read 操作上,造成線程資源浪費

nio介紹

  1. Java NIO 全稱 java non-blocking IO,是指 JDK 提供的新 API。從 JDK1.4 開始,Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的
  2. NIO 相關類都被放在 java.nio 包及子包下,并且對原 java.io 包中的很多類進行改寫。【基本案例】
  3. NIO 有三大核心部分:Channel(通道),**Buffer(緩沖區), Selector(**選擇器)
Selector 、 Channel 和 Buffer 的關系圖:
java轉義字元的使用和功能,砥砺前行!
  1. 每個channel都會對應一個Buffer
  2. Selector 對應一個線程, 一個線程對應多個 channel(連接配接)
  3. 該圖反應了有三個channel注冊到該selector//程式
  4. 程式切換到哪個channel是有事件決定的,Event就是一個重要的概念
  5. Selector 會根據不同的事件,在各個通道上切換
  6. Buffer 就是一個記憶體塊 , 底層是有一個數組
  7. 資料的讀取寫入是通過Buffer,這個和BIO,BIO中要麼是輸入流,或者是輸出流, 不能雙向,但是 NIO 的 Buffer 是可以讀也可以寫, 需要 flip 方法切換 channel 是雙向的, 可以傳回底層作業系統的情況, 比如 Linux , 底層的作業系統通道就是雙向的。

緩沖區(Buffer)

緩沖區(Buffer):緩沖區本質上是一個可以讀寫資料的記憶體塊,可以了解成是一個容器對象**(含數組)**,該對象提供了一組方法,可以更輕松地使用記憶體塊,,緩沖區對象内置了一些機制,能夠跟蹤和記錄緩沖區的狀态變化情況。Channel 提供從檔案、網絡讀取資料的管道,但是讀取或寫入的資料都必須經由 Buffer。

java轉義字元的使用和功能,砥砺前行!

channel

NIO 的通道類似于流,但有些差別如下:

  • 通道可以同時進行讀寫,而流隻能讀或者隻能寫
  • 通道可以實作異步讀寫資料
  • 通道可以從緩沖讀資料,也可以寫資料到緩沖:
  1. BIO 中的 stream 是單向的,例如 FileInputStream 對象隻能進行讀取資料的操作,而 NIO 中的通道(Channel) 是雙向的,可以讀操作,也可以寫操作。
  2. Channel 在 NIO 中是一個接口

    public interface Channel extends Closeable{}

  3. 常 用 的 Channel 類 有 : FileChannel 、 DatagramChannel 、 ServerSocketChannel 和 SocketChannel 。 【ServerSocketChanne 類似 ServerSocket , SocketChannel 類似 Socket】

Selector 示意圖和特點說明

  1. Java 的 NIO,用非阻塞的 IO 方式。可以用一個線程,處理多個的用戶端連接配接,就會使用到 Selector(選擇器)
  2. Selector 能夠檢測多個注冊的通道上是否有事件發生(注意:多個 Channel 以事件的方式可以注冊到同一個 Selector),如果有事件發生,便擷取事件然後針對每個事件進行相應的處理。這樣就可以隻用一個單線程去管 理多個通道,也就是管理多個連接配接和請求。
  3. 隻有在連接配接/通道真正有讀寫事件發生時,才會進行讀寫,就大大地減少了系統開銷,并且不必為每個連接配接都 建立一個線程,不用去維護多個線程
  4. 避免了多線程之間的上下文切換導緻的開銷
java轉義字元的使用和功能,砥砺前行!
  1. Netty 的 IO 線程 NioEventLoop 聚合了 Selector(選擇器,也叫多路複用器),可以同時并發處理成百上千個客

    戶端連接配接。

  2. 當線程從某用戶端 Socket 通道進行讀寫資料時,若沒有資料可用時,該線程可以進行其他任務。
  3. 線程通常将非阻塞 IO 的空閑時間用于在其他通道上執行 IO 操作,是以單獨的線程可以管理多個輸入和輸出

    通道。

  4. 由于讀寫操作都是非阻塞的,這就可以充分提升 IO 線程的運作效率,避免由于頻繁 I/O 阻塞導緻的線程挂

    起。

  5. 一個 I/O 線程可以并發處理 N 個用戶端連接配接和讀寫操作,這從根本上解決了傳統同步阻塞 I/O 一連接配接一線程模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升。

最後

經過日積月累, 以下是小編歸納整理的深入了解Java虛拟機文檔,希望可以幫助大家過關斬将順利通過面試。

由于整個文檔比較全面,内容比較多,篇幅不允許,下面以截圖方式展示 。如有需要擷取資料文檔的朋友,可以點選這裡免費擷取

java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!
java轉義字元的使用和功能,砥砺前行!

鍊圖檔轉存中…(img-9ELos25F-1624785829879)]

[外鍊圖檔轉存中…(img-6ufzLl15-1624785829880)]

由于篇幅限制,文檔的詳解資料太全面,細節内容太多,是以隻把部分知識點截圖出來粗略的介紹,每個小節點裡面都有更細化的内容!

繼續閱讀