1. 程式人生 > >1.大資料學習之旅——NIO

1.大資料學習之旅——NIO

Concurrent包

jdk1.5所提供的一個針對高併發進行程式設計的包。

阻塞式佇列 - BlockingQueue

遵循先進先出(FIFO)的原則。阻塞式佇列本身使用的時候是需要指定界限。
ArrayBlockingQueue - 阻塞式順序佇列 - 底層是基於陣列來進行儲存,使用的
時候需要指定一個容量, 容量在指定之後不可改變。— 生產-消費模型
LinkedBlockingQueue - 阻塞式鏈式佇列 - 底層是基於連結串列(節點)來進行資料
的儲存。在使用的時候可以指定初始容量,也可以不指定。如果指定了容
量,就以指定的容量為準來進行儲存;如果不指定容量,那麼預設容量是
Integer.MAX_VALUE -> 2 31 - 1。如果不指定容量,一般認為這個容量是無限的
PriorityBlockingQueue - 具有優先順序的阻塞式佇列 - 如果不指定容量,預設容量
是11。如果將元素一一取出,那麼會對元素進行自然排序 — 要求儲存的對
象所對應的類必須實現Comparable, 重寫compareTo方法, 將比較規則寫到方
法中;如果進行迭代遍歷, 那麼不保證排序
SynchronousQueue - 同步佇列 - 只允許儲存1個元素

併發對映 - ConcurrentMap

HashMap - 底層依靠陣列+連結串列儲存的資料。預設初始容量是16,預設載入
因子是0.75f,預設擴容每次增加一倍。本身是一個非同步式執行緒不安全的對映
Hashtable - 同步式執行緒安全的對映 — 對外提供的方法都是同步方法
ConcurrentHashMap - 非同步式執行緒安全的對映 - 在jdk1.8之前,採用分段(分桶)
鎖, 分段鎖採用的是讀寫鎖機制(讀鎖:允許多個執行緒讀,但是不允許執行緒
寫;寫鎖:允許一個執行緒寫,但是不允許執行緒讀);jdk1.8不再採用鎖機
制,而是CAS(Compare and Swap)演算法, 減小了鎖的開銷;如果一個桶中的元
素個數超過了8個,那麼會將這個桶的連結串列扭轉成一棵紅黑樹(自平衡二叉
查詢樹)結構。

在這裡插入圖片描述

紅黑樹的修正過程:

  1. 當前節點為紅色,且父節點以及叔父節點為紅,那麼將父節點以及叔父
    節點塗黑,將祖父節點塗紅
  2. 當前節點為紅色,並且是右子葉,父節點為紅且叔父節點為黑,那麼以
    當前節點為基準進行左旋
  3. 當前節點為紅色,並且是左子葉,父節點為紅且叔父節點為黑,那麼以
    父節點為基準進行右旋
    紅黑樹的修正過程:
    紅黑樹的查詢的時間複雜度是:O(logn)

NIO

是jdk1.4出現的新的流.
BIO - Blocking IO - 同步式阻塞式IO — UDP/TCP
NIO - New IO - 同步式非阻塞式IO
AIO - AsynchronousIO - 非同步式非阻塞式IO - jdk1.8

BIO的缺點:

  1. 會產生阻塞行為 — receive/accept/connect/read/write
  2. 一對一的連線:每連線一個客戶端,在伺服器端就需要開啟一個執行緒去處
    理請求.在客戶端較多的情況下,伺服器端就會產生大量的執行緒 - 耗費內
  3. 連線建立之後如果不發生任何的操作.那麼就會導致伺服器中的這個線
    程依然被佔用,耗費伺服器的資源
  4. 無法實現定點操作

NIO

三個基本的元件:Buffer-緩衝區, Channel-通道, Selector-多路複用選擇器

Buffer - 緩衝區

容器 - 儲存資料 - 在底層儲存資料的時候實際上是以陣列形式來儲存
capacity - 容量位 - 指定緩衝區的容量
limit - 限制位 - 限制操作位所能達到的尺度
position - 操作位 - 指定要操作的位置
mark - 標記位 - 標記位置,認為標記位置之前的資料是已經操作過的沒有錯
誤的資料
mark <= position <= limit <= capacity
flip - 反轉緩衝區:先將限制位挪到操作位上, 然後將操作位歸零, 清空標記位
clear - 清空緩衝區: 將操作位歸零,將limit挪到capacity,將標記位清空
reset - 重置緩衝區: 將操作位挪到標記位
rewind - 重繞緩衝區: 將操作位歸零,將標記位清空 — 緩衝區多次讀取

Channel - 通道

傳輸資料 - 是面向緩衝區的。在java中,Channel預設也是阻塞的,需要手
動將其設定為非阻塞模式。
BIO: File、UDP - DatagramSocket、TCP - Socket, ServerSocket
NIO: FileChannel、UDP - DatagramChannel、TCP - SocketChannel,
ServerSocketChannel
FileChannel - 操作檔案,可以利用通道實現相同平臺之間的零拷貝技術。

Selector - 多路複用選擇器

進行選擇 - 是面向通道進行操作。要求通道在使用的時候必須設定為非阻

可連線,可讀、可寫
客戶端
可接受,可讀,可寫
服務端
通過Selector可以實現利用同一個伺服器端來處理多個客戶端的資料 — 可
以用少量執行緒處理大量的請求 — 在底層處理的時候實際上依然是同步的

NIO的優勢:

  1. 非阻塞:提高傳輸效率
  2. 一對多的連線:可以用一個或者少量的伺服器中的執行緒來處理大量的請
    求,從而節省伺服器的記憶體資源
  3. 即使已經建立連線,只要沒有對應的讀寫事件,那麼依然不能夠使用服
    務器來進行處理
  4. 利用通道實現資料的雙向傳輸
  5. 因為利用緩衝區來儲存資料,所以可以對緩衝區中的資料實現定點操作

原始碼下載
下一篇 2.大資料學習之旅——紅黑樹