5基礎構建模塊——併發容器

併發容器java

經過併發容器來替代同步容器,提供性能,能夠極大地提升伸縮性並下降風險。安全

Java 5.0增長了兩種新的容器類型:Queue和BlockingQueue。Queue的實現有:ConcurrentLinkedQueue,這是一個傳統的先進先出的隊列,PriorityQueue(非併發的)優先隊列。Queue上的操做不會阻塞,若是隊列爲空,獲取隊列元素的操做將返回空值。併發

BlockingQueue擴展了Queue,增長了可阻塞的插入和獲取操做。若是隊列爲空獲取元素的操做,那麼獲取隊列元素的操做將一直阻塞,直到隊列出現一個可用的元素。若是隊列已滿(對於有界隊列來講),那麼插入元素的操做將一直阻塞,直到隊列中出現可用的空間。性能

ConcurrentHashMap與HashMap同樣也是基於散列的Map,可是它徹底使用了不用的加鎖策略來提供更高的併發性和可伸縮性。ConcurrentHashMap並非在每一個方法上都使用同一個鎖來同步,而是使用了一種粒度更細的加鎖機制來實現更大程度的共享,也就是分段鎖。在這種機制中,任意數量的線程能夠併發地訪問Map,執行讀取的線程和寫入的線程能夠併發的進行,而且必定數量的寫入線程能夠併發地修改Map。ConcurrentHashMap容器在迭代的時候不會拋出ConcurrentModificationException,所以不須要在迭代的過程加鎖。ConcurrentHashMap返回的迭代器具備弱一致性(Weakly Consistent),而並不是「即便失敗」。弱一致性的迭代器能夠容忍併發的修改,當建立迭代器時會遍歷全部的元素,並能夠(但不保證)在迭代被構建後修改操做反應給容器。儘管這樣,任然仍是有權衡的因素。對於須要在對整個Map進行計算的方法,例如size和isEmpty,這些方法的語義被略微減弱了以反應容器的併發特性。size在計算結果時可能已通過期了,它其實是一個估計值,所以size返回的是一個近似值不是精確值。.net

額外的原子操做線程

ConcurrentHashMap不能被加鎖來進行獨佔的訪問,所以咱們沒法使用客戶端加鎖來建立新的原子操做。這些複合操做都實現了原子操做,例如「若沒有則添加」,「若相對則移除(Remove-If-Equal)」和「若相等則替換(Replace-If-Equal)」等。對象

CopyOnWriteArrayList隊列

CopyOnWriteArrayList用於替換同步List,在某些狀況下提供了更好的併發性能。而且迭代期間不須要對容器進行加鎖或複製。「寫入時複製(Copy-On-Write)」容器的線程安全在於,只要正確的發佈一個事實的不可變對象,那麼訪問該對象就不須要加鎖同步。每次修改時,都會建立並從新發佈一個新的容器副本,從而實現可變性。「寫入時複製」容器迭代操做不會拋出ConcurrentModificationException,而且返回時的元素與迭代器建立時的元素徹底一致,而沒必要考慮以後修改操做帶來的影響。「寫入時複製」容器修改操做須要必定的開銷,因此僅當迭代操做遠遠多於修改操做的時候,才應該使用它。get

相關文章
相關標籤/搜索