問二十八:說說雙端隊列(Deque )與工作密取(Work Stealing)?

Java 6增加了兩種容器類型,Deque (發音爲“deck”)和BlockingDeque,它們分別對 Queue和BlockingQueue進行了擴展。Deque是一個雙端隊列,實現了在隊列頭和隊列尾的髙. 效插入和移除。具體實現包括ArrayDeque和LinkedBlockingDeque。

正如阻塞隊列適用於生產者-消費者模式,雙端隊列同樣適用於另一種相關模式,即工作 密取(Work Stealing)。在生產者-消費者設計中,所有消費者有一個共享的工作隊列,而在 工作密取設計中,每個消費者都有各自的雙端隊列。如果一個消費者完成了自己雙端隊列中的 全部工作,那麼它可以從其他消費者雙端隊列末尾祕密地獲取工作。密取工作模式比傳統的生 產者-消費者模式具有更高的可伸縮性,這是因爲工作者線程不會在單個共享的任務隊列上發 生競爭。在大多數時候,它們都只是訪問自己的雙端隊列,從而極大地減少了競爭。當工作者 線程需要訪問另一個隊列時,它會從隊列的尾部而不是從頭部獲取工作,因此進一步降低了隊 列上的競爭程度。

工作密取非常適用於既是消費者也是生產者問題——當執行某個工作時可能導致出現更多 的工作。例如,在網頁爬蟲程序中處理一個頁面時,通常會發現有更多的頁面需要處理。類似 的還有許多搜索圖的算法,例如在垃圾回收階段對堆進行標記,都可以通過工作密取機制來實 現髙效並行。當一個工作線程找到新的任務單元時,它會將其放到自己隊列的末尾(或者在工 作共享設計模式中,放入其他工作者線程的隊列中)。當雙端隊列爲空時,它會在另一個線程 的隊列隊尾查找新的任務,從而確保每個線程都保持忙碌狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章