Concurrent包詳解及使用場景

2022-07-04 04:36:11 字數 3379 閱讀 9386

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

遵循先進先出(fifo)的原則。阻塞式佇列本身使用的時候是需要指定界限的。

在生產者消費者模型中,生產資料和消費資料的速率不一致,如果生產資料速度快一些,消費(處理)不過來,就會導致資料丟失。這時候我們就可以應用上阻塞佇列來解決這個問題。

底層是基於陣列來進行儲存,使用的時候需要指定乙個容量,容量指定之後不可改變。--- 生產 - 消費模型

public static void main(string args) throws interruptedexception

底層是基於鍊錶(節點)來進行資料的儲存。在使用的時候可以指定初始容量,也可以不指定。

如果指定了容量,就以指定的容量為準來進行儲存;

如果不指定容量,那麼預設容量是 integer.max_value -> 231 - 1。如果不指定容量,一般認為這個容量是無限的。

如果不指定容量,預設容量是11.如果將元素取出,那麼會對元素進行自然排序 --- 要求儲存的物件所對應的類必須實現comparable,重寫compareto方法,講比較規則寫到方法中;如果進行迭代遍歷,那麼不保證排序。

只允許儲存1個元素。

預設初始容量是16,預設載入因子是0.75f,預設擴容每次增加一倍。本身是乙個非同步式執行緒不安全的對映

對外提供的方法都是同步方法

在jdk1.8之前,採用分段(分桶)鎖, 分段鎖採用的是讀寫鎖機制(讀鎖:允許多個執行緒讀,但是不允許執行緒寫;寫鎖:允許乙個執行緒寫,但是不允許執行緒讀);jdk1.8不再採用鎖機制,而是cas(compare and swap)演算法, 減小了鎖的開銷;如果乙個桶中的元素個數超過了8個,那麼會將這個桶的鍊錶扭轉成一棵紅黑樹(自平衡二叉查詢樹)結構。

本身是乙個介面,所以更多的是使用實現類

跳躍表:為了提高查詢效率所產生的一種資料結構

跳躍表是典型的以空間換時間的產物。

跳躍表的時間複雜度是o(logn)

如果跳躍表中插入新的元素,新的元素是否往上提取,遵循「拋硬幣」原則 --- 1/2原則

只要保證這個節點有一半的概率被提取就可以

跳躍表適合大量查詢而不增刪的場景

countdownlatch - 閉鎖 - 執行緒減鎖

對執行緒neg進行計數,當計數歸零的時候會開放阻塞執行緒繼續往下執行

system.out.println("學生交卷離開考場");

// 計數-1

cdl.countdown();}}

class teacher implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println("老師收卷離開了考場~~~");

cdl.countdown();}}

遵循先進先出(fifo)的原則。阻塞式佇列本身使用的時候是需要指定界限的。

在生產者消費者模型中,生產資料和消費資料的速率不一致,如果生產資料速度快一些,消費(處理)不過來,就會導致資料丟失。這時候我們就可以應用上阻塞佇列來解決這個問題。

底層是基於陣列來進行儲存,使用的時候需要指定乙個容量,容量指定之後不可改變。--- 生產 - 消費模型

public static void main(string args) throws interruptedexception

底層是基於鍊錶(節點)來進行資料的儲存。在使用的時候可以指定初始容量,也可以不指定。

如果指定了容量,就以指定的容量為準來進行儲存;

如果不指定容量,那麼預設容量是 integer.max_value -> 231 - 1。如果不指定容量,一般認為這個容量是無限的。

如果不指定容量,預設容量是11.如果將元素取出,那麼會對元素進行自然排序 --- 要求儲存的物件所對應的類必須實現comparable,重寫compareto方法,講比較規則寫到方法中;如果進行迭代遍歷,那麼不保證排序。

只允許儲存1個元素。

預設初始容量是16,預設載入因子是0.75f,預設擴容每次增加一倍。本身是乙個非同步式執行緒不安全的對映

對外提供的方法都是同步方法

在jdk1.8之前,採用分段(分桶)鎖, 分段鎖採用的是讀寫鎖機制(讀鎖:允許多個執行緒讀,但是不允許執行緒寫;寫鎖:允許乙個執行緒寫,但是不允許執行緒讀);jdk1.8不再採用鎖機制,而是cas(compare and swap)演算法, 減小了鎖的開銷;如果乙個桶中的元素個數超過了8個,那麼會將這個桶的鍊錶扭轉成一棵紅黑樹(自平衡二叉查詢樹)結構。

本身是乙個介面,所以更多的是使用實現類

跳躍表:為了提高查詢效率所產生的一種資料結構

跳躍表是典型的以空間換時間的產物。

跳躍表的時間複雜度是o(logn)

如果跳躍表中插入新的元素,新的元素是否往上提取,遵循「拋硬幣」原則 --- 1/2原則

只要保證這個節點有一半的概率被提取就可以

跳躍表適合大量查詢而不增刪的場景

countdownlatch - 閉鎖 - 執行緒減鎖

對執行緒neg進行計數,當計數歸零的時候會開放阻塞執行緒繼續往下執行

system.out.println("學生交卷離開考場");

// 計數-1

cdl.countdown();}}

class teacher implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println("老師收卷離開了考場~~~");

cdl.countdown();}}

concurrent包簡介 Condition 類

condition的基本使用如下 condition是個介面,基本的方法就是await 和signal 方法 condition依賴於lock介面,生成乙個condition的基本 是lock.newcondition 呼叫condition的await 和signal 方法,都必須在lock保護之...

showModalDialog引數詳解 使用方法

基本介紹 showmodaldialog ie 4 支援 showmodelessdialog ie 5 支援 window.showmodaldialog 方法用來建立乙個顯示html內容的模態對話方塊。window.showmodelessdialog 方法用來建立乙個顯示html內容的非模態對...

python包使用 Python模組和包使用

1 什麼是模組 模組就是乙個.py的檔案 2 為什麼要使用模組?最開始的程式 沒有任何組織 函式 類 模組 包 為了讓程式的組織結構更加靈活清晰,降低耦合性 方便管理 3 如何使用模組 1 import 只能匯入在當前目錄 和內建的模組,使用模組裡的內容需要 模組.來呼叫 2 from.import...