day2 Java NIO

hgs19921112發表於2018-10-17

高併發基礎 Day02
複習
1. BlockingQueue :阻塞式佇列,使用的時候需要指定容量,而且容量指定之後不可改變。
    1. ArrayBlockingQueue :基於陣列進行儲存。
    2. LinkedBlockingQueue :基於連結串列進行儲存。在使用的時候可以指定容量也可以不指定。如果不指定,
        則預設按照
Integer 最大值來計算。
    3. PriorityBlockingQueue :在使用的時候要求元素對應的類必須實現 Comparable 。在迭代的時候不保證
        元素的排序,只有在一個個的取得時候才能保證。
    4. SynchronousQueue :同步佇列。只能儲存一個元素。
2. ConcurrentMap :併發對映
    1. ConcurrentHashMap :底層在儲存資料的時候是依靠分段鎖機制,在 JDK1.8 中,採取了 CAS 無鎖演算法來
        取代了分段鎖。底層依然是依靠的陣列來作為基本結構,但是從
JDK1.8 開始,不再採取陣列 + 連結串列結構而
        是採取陣列
+ 紅黑樹機制。
        1. 紅黑樹本身是自平衡二叉查詢樹。
        2. 紅黑樹的特點
            1. 每一個節點非黑即紅
            2. 根節點一定是黑色
            3. 紅節點的子節點一定是黑色
            4. 最底層的葉子節點一定是黑色的 nil 節點
            5. 任意一條路徑包含的黑節點的個數是一致的
            6. 插入的節點一定是紅色
    3. 紅黑樹的平衡性修正
        1. 如果父節點以及叔父節點都是紅色,則將父節點以及叔父節點塗黑,將祖父節點塗紅
        2. 如果叔父節點是黑色,並且當前節點是右子葉,則以當前節點為基準進行左旋
        3. 如果叔父節點是黑色,並且當前節點是左子葉,則以父節點為基準進行右旋
    2. ConcurrentNavigableMap :併發導航對映。實現類之一是採取的跳躍表機制。跳躍表的特點是以空間
        換時間。時間複雜度是
O(logn)
3. 執行緒池
    1. 減少執行緒的建立和銷燬從而節省記憶體資源
    2. 執行緒池是由核心執行緒、工作佇列、臨時執行緒以及拒絕執行處理器組成
    3. Callable Runnalbe 區別:返回值、異常、啟動方式
4. Lock
    1.
synchronized 要更加的靈活和精細
    2. 預設是非公平策略,可以手動設定為公平
    3. CountDownLatch :執行緒遞減鎖 / 閉鎖。當所有的執行緒都執行到同一節點之後進行統一處理
    4 . CyclicBarrier :柵欄。所有的執行緒到達同一節點之後再分別往下繼續執行。
5. Exchanger :交換機。用於交換兩個執行緒的資訊
6. Semaphore :訊號量。每一個執行緒取得一個訊號,當訊號被用完之後,其他執行緒只能被阻塞,只有當線
    程釋放訊號的時候,被阻塞的執行緒才能取得訊號繼續執行。

原子性操作
    在物件的底層進行加鎖,保證物件在同一時刻只能被一個執行緒操作。
回顧:記憶體
java 將記憶體大致分為 5 塊:棧記憶體、堆記憶體、方法區、本地方法棧、 PC 計數器(暫存器)。
棧記憶體:計算。所有的方法以及程式碼塊的執行都是在棧記憶體中。每一個執行緒獨享一個棧。
堆記憶體:儲存物件。
方法區:儲存類資訊,常量(字面量、自定義常量)。
本地方法棧:計算。所有的本地方法(
native )的執行都在本地方法棧。
PC 計數器:程式的計數和執行緒的排程。
NIO
BIO - Blocking IO - 同步式阻塞式 IO
BIO 的缺點
1. 如果有大量的請求訪問伺服器,那麼就要產生大量的執行緒去應對這些請求,導致伺服器資源過於緊張
2. 在完成一次任務的過程中需要建立大量的輸入或者輸出流
3. 資料透過流傳輸,無法實現定點操作
4. 阻塞模式
NIO - New IO - 同步式非阻塞式 IO Buffer Channel Selector --- Buffer 是容器,用於儲存資料; Channel
於傳輸;
Selector 進行過濾。
Buffer - 緩衝區
用於進行資料的儲存,儲存的時候都是用的陣列。操作的都是基本型別。
資料在操作的時候是根據操作位
position 的位置決定。
限制位
limit 是決定操作位所能達到的最大值
標記位
mark 用於進行位置的標記,在出現錯誤的時候可以回到標記位進行重新操作,可以不用重複操作前邊的數

容量位
capacity 用於固定容量
標記位
<= 操作位 <= 限制位 <= 容量位
翻轉緩衝區:將限制位挪到操作位上,將操作位歸零,清除標記位
重置緩衝區:將操作位挪到標記位
重繞緩衝區:將操作位歸零,清除標記位
清空緩衝區:並不是將緩衝區真正清空,只是將操作位歸零,將限制位挪到容量位,將標記位清除
Channel - 通道
傳輸資料,基於緩衝區進行傳輸。可以進行雙向傳輸。
預設是阻塞的,可以設定為非阻塞。但是往往需要進行手動阻塞
TCP : SocketChannel , ServerSocketChannel
UDP : DatagramChannel
File : FileChannel
Selector - 多路複用通道選擇器
可以選擇出有用的事件或者是連線,進行事件的處理。
客戶端的事件:可連線、可讀、可寫
伺服器端的事件:可接受、可讀、可寫
tomcat5: 使用的是傳統的 BIO
tomcat6:
使用 NIO
AIO - Asynchronous IO -
非同步式非阻塞式 IO - JDK1.8 - NIO 的基礎上延伸出來的,所以稱之為 NIO.2

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2216725/,如需轉載,請註明出處,否則將追究法律責任。