天天看點

[Java 基礎] 并發隊列ConcurrentLinkedQueue和阻塞隊列LinkedBlockingQueue用法

在Java多線程應用中,隊列的使用率很高,多數生産消費模型的首選資料結構就是隊列(先進先出)。Java提供的線程安全的Queue可以分為阻 塞隊列和非阻塞隊列,其中阻塞隊列的典型例子是BlockingQueue,非阻塞隊列的典型例子是ConcurrentLinkedQueue,在實際 應用中要根據實際需要選用阻塞隊列或者非阻塞隊列。

注:什麼叫線程安全?這個首先要明确。線程安全就是說多線程通路同一代碼,不會産生不确定的結果。

并行和并發差別

1、并行是指兩者同時執行一件事,比如賽跑,兩個人都在不停的往前跑;

2、并發是指資源有限的情況下,兩者交替輪流使用資源,比如一段路(單核CPU資源)同時隻能過一個人,A走一段後,讓給B,B用完繼續給A ,交替使用,目的是提高效率

LinkedBlockingQueue

由于LinkedBlockingQueue實作是線程安全的,實作了先進先出等特性,是作為生産者消費者的首選,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,預設最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候 會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。

[Java 基礎] 并發隊列ConcurrentLinkedQueue和阻塞隊列LinkedBlockingQueue用法
[Java 基礎] 并發隊列ConcurrentLinkedQueue和阻塞隊列LinkedBlockingQueue用法

ConcurrentLinkedQueue

ConcurrentLinkedQueue是Queue的一個安全實作.Queue中元素按FIFO原則進行排序.采用CAS操作,來保證元素的一緻性。

LinkedBlockingQueue 是一個線程安全的阻塞隊列,它實作了BlockingQueue接口,BlockingQueue接口繼承自java.util.Queue接口,并在這 個接口的基礎上增加了take和put方法,這兩個方法正是隊列操作的阻塞版本。

[Java 基礎] 并發隊列ConcurrentLinkedQueue和阻塞隊列LinkedBlockingQueue用法
[Java 基礎] 并發隊列ConcurrentLinkedQueue和阻塞隊列LinkedBlockingQueue用法

運作結果:

costtime 2360ms

改用while (queue.size()>0)後

cost time 46422ms

結果居然相差那麼大,看了下ConcurrentLinkedQueue的API原來.size()是要周遊一遍集合的,難怪那麼慢,是以盡量要避免用size而改用isEmpty().

總結了下, 在機關缺乏性能測試下,對自己的程式設計要求更加要嚴格,特别是在生産環境下更是要小心謹慎。

本文轉自demoblog部落格園部落格,原文連結http://www.cnblogs.com/0616--ataozhijia/p/5022046.html如需轉載請自行聯系原作者

demoblog

繼續閱讀