day2 Java NIO
高併發基礎
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java NIOJava
- JAVA NIO BufferJava
- JAVA 探究NIOJava
- Java NIO SocketChannelJava
- Java NIO - BufferJava
- Java NIO - 群聊Java
- Java NIO:通道Java
- Java NIO filesJava
- Java NIO之SelectorJava
- Java NIO之BufferJava
- Java IO 和 NIOJava
- java NIO SocketClinet ServerSocketJavaServer
- Java NIO 概覽Java
- Java Socket 之 NIOJava
- 詳解 Java NIOJava
- 淺析Java NIOJava
- Asyncdb(三):Java NIOJava
- Java IO之NIOJava
- Java NIO Channel 使用Java
- Java BIO,NIO,AIOJavaAI
- Java nio記錄Java
- java基礎Day2 HelloWorldJava
- 【譯】Java NIO 簡明教程系列之 NIO 概述Java
- 深入的聊聊 Java NIOJava
- Java NIO 程式碼示例Java
- java BIO、NIO學習Java
- Java NIO 之 Channel(通道)Java
- Java NIO - Channel 與 SelectorJava
- Java NIO - 零拷貝Java
- Java NIO - 零複製Java
- Java NIO:選擇器Java
- Java NIO:緩衝區Java
- Java NIO Selector 的使用Java
- Java-NIO之SelectorJava
- 【譯】Java NIO 簡明教程系列之 NIO 簡介Java
- Java NIO學習系列四:NIO和IO對比Java
- Java NIO和NIO.2有什麼區別? | baeldungJava
- Java NIO:Buffer、Channel 和 SelectorJava