1. 程式人生 > >同步佇列(阻塞佇列和非阻塞佇列)

同步佇列(阻塞佇列和非阻塞佇列)

在併發程式設計中,很多情況下需要使用執行緒安全的佇列。而實現執行緒安全的佇列有兩種實現方式

1、使用阻塞演算法:使用阻塞演算法的佇列可以用一個鎖(入隊和出隊使用同一把鎖)或兩個鎖(入隊和出隊用不同的鎖)等方式來實現(基於鎖的演算法會帶來一些活躍度失敗的風險。如果執行緒在持有鎖的時候因為阻塞I/O,頁面錯誤,或其他原因發生延遲,很可能所有的執行緒都不能前進了)

2、使用非阻塞演算法:使用迴圈CAS的方式來實現(一個執行緒的失敗或掛起不應該影響其他執行緒的失敗或掛起)

*阻塞佇列:當佇列為空時,從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時,往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他執行緒往空的佇列中插入新的元素,同樣,試圖往已滿的阻塞佇列中新增新元素的執行緒同樣也會被阻塞,直到其他的執行緒使佇列重新變得空閒起來

java中常見的非阻塞佇列:

1) ConcurrentHashMap 2) ConcurrentSkipListMap 3) ConcurrentSkipListSet 4) ConcurrentLinkedQueue 5) ConcurrentLinkedDeque 6) CopyOnWriteArrayList 7) CopyOnWriteArraySet

 java中的阻塞佇列

·ArrayBlockingQueue:一個由陣列結構組成的有界阻塞佇列。 ·LinkedBlockingQueue:一個由連結串列結構組成的有界阻塞佇列。 ·PriorityBlockingQueue:一個支援優先順序排序的無界阻塞佇列。 ·DelayQueue:一個使用優先順序佇列實現的無界阻塞佇列。 ·SynchronousQueue:一個不儲存元素的阻塞佇列。 ·LinkedTransferQueue:一個由連結串列結構組成的無界阻塞佇列。 ·LinkedBlockingDeque:一個由連結串列結構組成的雙向阻塞佇列。 --------------------- 本文來自 nogos 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/sunxianghuang/article/details/52046150?utm_source=copy