高併發編程集合篇

傳統的集合我導致線程不安全問題,於是我們應該使用線程安全的集合。

1、使用ConcurrentHashMap代替HashMap,ConcurrentHashMap內部進一步細分了若干個小的HashMap段,默認爲16個。

2、ConcurrentSkipListMap:跳錶的實現。是一個Map,使用跳錶的數據結構進行快速查找,特點:有序的,平衡樹,分層的列表、跳躍式查詢、空間換時間。

3、使用Vector代替ArrayList。

4、CopyOnWriteArrayList:在讀多寫少的場合,這個List的性能非常好,遠好於Vector。讀的時候不加鎖,寫的時候加鎖,並且會拷貝原來的數組,生成一個新的數組,然後對這個拷貝的數組進行寫入,然後再把修改過的數組替換原數組,這樣,再寫入的同時,如果有讀的操作,也不會出現衝突問題,因爲原數組沒有改變。

5、ConcurrentLinkedQueue:高效的併發隊列(高併發環境中性能最好的隊列),使用鏈表實現,線程安全的LinkdeList(底層使用CAS無鎖機制實現),ConcurrentLinkedQueue(非阻塞式無界隊列)容易出問題,入列不等待,出列不等待,可能會造成數據丟失。

6、BlockingQueue接口(阻塞式)使用多,僅僅用來存放runnable接口
    工作方式
        入列
            當插入數據時,超過了隊列的總數,會等待(阻塞)
        出列
            當獲取數據時,值爲空,會等待(阻塞)
    種類
        SynchronousQueue直接提交隊列
            沒有容量的情況下,每一個插入操作都要等待響應的刪除操作,反之,每一個刪除操作都要等待對應的插入操作。不會保存任務,直接交給線程執行,沒有空閒線程嘗試創建新線程,線程數量達到最大值,則執行拒絕策略。因此通常設置很大的maximumPoolSize值,不然很容易執行拒絕策略
        ArrayBlockingQueue有界任務隊列
            創建時給定容量,新任務進來若大於核心線程數,在不大於最大線程數的前提下,會繼續創建,如果大於最大線程數,則執行拒絕策略
            寫入
                offer()當隊列滿了立即返回false
                put()當隊列滿了會一直等待,直到隊列中有空閒的位置
            讀出
                poll()隊列爲空直接返回null
                take()會等待,直到隊列內有元素
        LinkedBlockingQueue無界任務隊列
            除非系統資源耗盡,否則不會造成任務入隊失敗
            鎖分離,take()和put()操作使用不同的鎖,削弱了鎖競爭的可能性。實現了取數據和寫數據的分離,是兩者在真正意義上成爲可併發的操作
        ProorityBlockingQueue優先任務隊列
            帶有優先級的隊列,控制任務的執行先後順序,特殊的無界隊列。

7、Collections工具類可以幫助我們將任意集合包裝成安全的集合,一般在併發級別不高的情況下夠用,因爲上了鎖,導致所有對集合的操作全部進入等待狀態
    Collections.synchronizedMap(new HashMap());
    Collections.synchronizedList(new LinkedList<String>());

    ……有關Collections工具類的不一一列舉了。

   

 

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