jdk提供兩套併發佇列實現,乙個是concurrentlinkedqueue為代表的高效能佇列,另乙個是以blockingqueue介面為代表的阻塞佇列,他們都繼承自queue介面;
concurrentlinkedqueue(執行緒安全的無界無阻塞佇列):是乙個適合高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態下的高效能,通常concurrentlinkedqueue效能好於blockingqueue,concurrentlinkedqueue是乙個基於鏈結節點的無界線程安全佇列;該佇列的元素遵循先進先出原則,即頭元素為最先加入,尾部元素為最近加入,該佇列不允許加入null元素。
concurrentlinkedqueue重要方法:
1.add()和offer()都是加入元素的方法(在concurrentlinkedqueue中,這兩個方法沒有區別);
2.poll()和peek()都是獲取頭元素節點的方法,區別在於poll()方法獲取元素後同時刪除元素,即取走;而peek()方法只是獲取元素。
blockingqueue介面(執行緒安全的阻塞佇列介面)
blockingqueue介面的重要方法:
1.offer(anobject):如果可能的話,將anobject加到blockingqueue裡,即如果blockingqueue可以容納,則返回true,否則返回false。(此方法不阻塞當前執行方法的執行緒)
2.offer(e o,long timeout,timeunit unit),可以設定等待時間,如果在指定的時間內還不能往佇列中加入元素,則返回失敗。
3.put(anobject)把anobject加到blockingqueue裡,如果blockingqueue沒有空間,則呼叫此方法的執行緒被阻塞直到blockingqueue有空間在繼續。
注意:put方法新增元素會阻塞執行緒,而offer方法不會阻塞執行緒而是直接返回成功或失敗。
4.poll(long timeout,timeunit unit),從blockingqueue取出乙個隊首的物件,如果在指定時間內,佇列有資料可取,則立即返回佇列中的資料,否則直到超時還沒有資料可取,則返回失敗。
5.take()取走blockingqueue中排在首位的物件,若blockingqueue為空,阻塞執行緒進入等待狀態直到blockingqueue有新的資料被加入後,取走執行緒結束;
6.drainto():一次性從blockingqueue獲取所有可用的資料物件(可以指定獲取資料個數),通過該方法可以提公升獲取資料效率,不需要多次分批加鎖和釋放鎖。
併發容器類Map
hashmap concurrenthashmap 認識了解concurrentskiplistmap 執行緒不安全 擴容時是非原子操作,會存在資料不完整,讀的時候會存在問題,執行緒不安全。從抽象角度,帶著問題看原始碼,看最熟悉的方法,主要關注是什麼而不是為什麼這麼做。jdk1.7版本 儲存資料結構...
併發程式設計核心 十二 併發類容器
jdk 5.0 以後提供了多種併發類容器來替代同步類容器從而改善效能。同步類容器的 狀態都是序列化的。他們雖然實現了執行緒安全,但是嚴重降低了併發性,在多執行緒環境時,嚴重降低了應用程式的吞吐量。併發類容器是專門針對併發設計的,使用 concurrenthashmap 來代替給予雜湊的傳 統的 ha...
併發佇列Queue
乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue為介面代表的阻塞佇列,都繼承自queue。concurrentlinkedqueue 是乙個適用高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態下的高效能,通常concurrentlinged...