双端队列与工作密取
Java6增加了兩種容器類型,Deque和BlockingDeque,它們分別對Queue和BlockingQueue進行了擴展。
?Deque是一個雙端隊列,實現了在隊列頭和隊列尾的高效插入和移除。具體實現包括ArrayDeque和LinkedBlockingDeque.
?正如阻塞隊列使用與生產者-消費者模式,雙端隊列同樣適用于另一種相關模式,即工作密取。在生產者-消費者設計中,所有消費者有一個共享的工作隊列,而在工作密取設計中,每個消費者都有各自的雙端隊列。如果一個消費者完成了自己雙端隊列中的全部工作,那么它可以從其它消費者雙端隊列末尾秘密地獲取工作。密取工作模式比傳統的生產者-消費者模式具有更高的可伸縮性,這是因為工作者線程不會在單個共享的任務隊列上發生競爭。在大多數時候,它們都只是訪問自己的雙端隊列,從而極大地減少了競爭。當工作者線程需要訪問另一個隊列時,它會從隊列的尾部而不是頭部獲取工作,因此進一步降低了隊列上的競爭程度。工作密取非常適用于即是消費者也是生產真問題--當執行某個工作時可能導致出現更多的工作。例如,在網頁爬蟲程序中處理一個頁面時,通常會發現有更多的頁面需要處理。類似的還有許多搜索圖的算法,例如在垃圾回收階段對堆進行標記,都可以通過工作密取機制來實現高效并行。當一個工作線程找到新的任務單元時,它會將其放到自己隊列的末尾(或者在工作共享模式中,放入其它工作者線程的隊列中)。當雙端隊列為空時,它會在另一個線程的隊列末尾查找新的任務,從而確保每個線程都保持忙碌狀態。
轉載于:https://www.cnblogs.com/drizzlewithwind/p/6392229.html
總結
- 上一篇: Spring核心--IOCAOP
- 下一篇: 《POSIX多线程程序设计》读书笔记