在Java多線程應用中,隊列的使用率很高,多數生産消費模型的首選資料結構就是隊列(先進先出)。Java提供的線程安全的Queue可以分為阻 塞隊列和非阻塞隊列,其中阻塞隊列的典型例子是BlockingQueue,非阻塞隊列的典型例子是ConcurrentLinkedQueue,在實際 應用中要根據實際需要選用阻塞隊列或者非阻塞隊列。
注:什麼叫線程安全?這個首先要明确。線程安全就是說多線程通路同一代碼,不會産生不确定的結果。
并行和并發差別
1、并行是指兩者同時執行一件事,比如賽跑,兩個人都在不停的往前跑;
2、并發是指資源有限的情況下,兩者交替輪流使用資源,比如一段路(單核CPU資源)同時隻能過一個人,A走一段後,讓給B,B用完繼續給A ,交替使用,目的是提高效率
LinkedBlockingQueue
由于LinkedBlockingQueue實作是線程安全的,實作了先進先出等特性,是作為生産者消費者的首選,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,預設最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候 會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。


ConcurrentLinkedQueue
ConcurrentLinkedQueue是Queue的一個安全實作.Queue中元素按FIFO原則進行排序.采用CAS操作,來保證元素的一緻性。
LinkedBlockingQueue 是一個線程安全的阻塞隊列,它實作了BlockingQueue接口,BlockingQueue接口繼承自java.util.Queue接口,并在這 個接口的基礎上增加了take和put方法,這兩個方法正是隊列操作的阻塞版本。


運作結果:
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