集合和并發(fā)包一覽

Java

集合

Collection

List

ArrayList
實現(xiàn)原理:基于可變數(shù)組實現(xiàn)徘禁,默認容量10,最大為Integer.MAX_VALUE
適用場景:非線程安全城看,支持隨機訪問政溃,插入和刪除涉及到數(shù)組的拷貝想帅,性能較低,適用于讀多寫少的場合尿庐。
LinkedList
實現(xiàn)原理:基于雙向鏈表實現(xiàn)忠怖,所占空間相比ArrayList要少,因為ArrayList擴容1.5倍抄瑟,存在空間浪費凡泣。
適用場景:非線程安全枉疼,不支持隨機訪問,實現(xiàn)了Queue接口鞋拟,對頭部或尾部做插入或刪除操作效率很高骂维,最多只影響一個節(jié)點。遍歷用迭代器效率最高贺纲。
Vector
ArrayList的線程安全版本航闺,通過synchronized關(guān)鍵字實現(xiàn)。性能較低猴誊,不常用潦刃。
CopyOnWriteArrayList
實現(xiàn)原理:寫操作加鎖,讀操作不加鎖懈叹。不直接對當前容器進行寫操作乖杠,而是copy一個新容器,然后在新容器里寫澄成。寫完后胧洒,將原容器的引用指向新容器。
適用場景:ArrayList線程安全版本墨状,內(nèi)存占用較大卫漫,只能保證數(shù)據(jù)的最終一致性。適用于讀多寫少的場合肾砂。

Set

HashSet:基于HashhMap列赎,HashSet里存儲的元素就是內(nèi)部HashMap的key。
TreeSet:基于TreeMap通今,TreeSet里存儲的元素就是內(nèi)部TreeMap的key粥谬。
CopyOnWriteArraySet:基于CopyOnWriteArrayList,只不過不能添加重復元素辫塌。
ConcurrentSkipListSet:基于ConcurrentSkipListMap漏策。

Queue

ArrayBlockingQueue:數(shù)組實現(xiàn)的有界阻塞隊列,當隊列滿時臼氨,生產(chǎn)的線程會被阻塞掺喻。當隊列為空時消費的線程被阻塞〈⒕兀基于ReentrantLock和Condition實現(xiàn)感耙。
LinkedBlockingQueue:鏈表實現(xiàn)的有界阻塞隊列。
ConcurrentLinkedQueue:鏈表實現(xiàn)的無阻塞隊列持隧,CAS+volatile保證線程安全即硼。
PriorityQueue:基于堆實現(xiàn)。
DelayQueue:基于PriorityQueue實現(xiàn)的延遲隊列屡拨。

Map

HashMap

實現(xiàn)原理
1.7 基于數(shù)組和鏈表實現(xiàn)只酥。put時褥实,通過k的hashcode算出索引,然后將Entry放到該位置裂允。如果該位置已存在元素损离,則比較hashcode和equals方法,判斷是否是同一個key绝编,若相同則替換為新值并返回舊值僻澎。添加Entry節(jié)點前會判斷是否要做resize操作,resize在多線程下可能會導致鏈表成環(huán)十饥,造成cpu100%窟勃。
1.8 相比于1.7,多了紅黑樹绷跑。當鏈表長度超過8的時候拳恋,會變成紅黑樹凡资。

LinkedHashMap

特點:繼承自HashMap砸捏,可以按插入順序或訪問順序(accessOrder為true時)遍歷。

TreeMap

特點:紅黑樹實現(xiàn)隙赁,可按元素的順序或特定比較器進行遍歷垦藏。

ConcurrentHashMap

實現(xiàn)原理
1.7 基于分段鎖,get不加鎖伞访,put先計算要put到哪個segment掂骏,再通過segment加鎖put。
1.8 基于Node+CAS+synchronized

ConcurrentSkipListMap

特點:線程安全厚掷,基于跳躍表實現(xiàn)弟灼。
實現(xiàn)原理:插入和刪除操作只需要改變影響到的節(jié)點的右引用,而右引用是用volatile修飾的冒黑。

并發(fā)

synchronized

實現(xiàn):基于編譯器時插入moniterenter和moniterexit指令田绑,由JVM內(nèi)部實現(xiàn)。

優(yōu)點:不需要顯式釋放鎖

缺點:效率低抡爹,線程上下文切換較多掩驱。但jdk1.6做了優(yōu)化。偏向鎖冬竟,輕量級鎖欧穴,重量級鎖。

java.util.concurrent

實現(xiàn):基于Java語言實現(xiàn)泵殴。

優(yōu)點:性能相對高涮帘,線程上下文切換較少。對鎖的可控性更強笑诅,共享獲取及超時獲取调缨。

缺點:需要顯式釋放鎖映屋。

AbstractQueuedSynchronizer

特點:其它并發(fā)工具的基礎(chǔ),內(nèi)部封裝了同步狀態(tài)管理同蜻,線程的排隊棚点、等待與喚醒等等底層操作。

ReentrantLock

特點:分為公平鎖和非公平鎖湾蔓,非公平鎖是默認實現(xiàn)瘫析。公平鎖對獲取鎖的條件更為苛刻,當鎖沒有被線程持有默责,還要保證等待隊列為空贬循,或者等待隊列中沒有其它線程在等待。(鎖的釋放到喚醒等待隊列的線程有一個延遲過程)
獲取鎖:都是先嘗試獲取鎖桃序,沒有獲取到杖虾,則以當前線程構(gòu)造一個節(jié)點加入到等待隊列尾。加入到等待隊列后媒熊,線程使用自旋的方式獲取鎖奇适。如果前驅(qū)節(jié)點為頭節(jié)點則嘗試獲取鎖,否則進入等待狀態(tài)芦鳍。
釋放鎖:鎖的釋放就是將state-1直到為0嚷往。釋放完還要喚醒等待隊列的線程爭奪鎖。

ReentrantReadWriteLock

特點:讀寫鎖在同一時刻可以允許多個讀線程訪問柠衅,但是在寫線程訪問時皮仁,所有的讀線程和其它的寫線程均被阻塞。讀寫鎖比排它鎖有更好的并發(fā)性和吞吐量菲宴。
讀鎖
獲却怼:如果已經(jīng)有讀鎖或者當前線程不是已經(jīng)獲取寫鎖的線程,則等待喝峦。如果獲取了寫鎖势誊,則增加寫狀態(tài)。寫鎖被獲取愈犹,則其它讀寫線程被阻塞键科。
釋放:基本和ReentrantLock相同
寫鎖
獲取:如果已經(jīng)有其它線程獲取了寫鎖漩怎,則當前獲取的線程被阻塞勋颖。
釋放:基本和ReentrantLock相同

CountDownLatch

特點:一個或多個線程等待其它線程完成某操作后,再繼續(xù)執(zhí)行勋锤。
實現(xiàn):構(gòu)造方法初始化state變量的值饭玲。線程調(diào)用await方法,實際上是獲取鎖狀態(tài)等不等于0叁执,等于0則繼續(xù)執(zhí)行茄厘,否則循環(huán)cas并判斷是否要進入阻塞狀態(tài)矮冬。其它線程調(diào)用countDown方法,實際上就是釋放鎖的過程次哈。當釋放到0時胎署,被阻塞線程則可以繼續(xù)執(zhí)行。

CyclicBarrier

特點:一組線程到達一個同步點后再一起往下執(zhí)行窑滞,任意一個線程沒到琼牧,則其它線程被阻塞。
實現(xiàn):基于ReentrantLock和Condition哀卫。構(gòu)造方法初始化需要被等待的線程數(shù)巨坊。調(diào)用await方法將值減1,當減到0時此改,喚醒被阻塞線程繼續(xù)執(zhí)行趾撵。否則該線程被阻塞。

Semaphore

特點:控制同時訪問某資源的最大線程數(shù)量共啃。
實現(xiàn):基于AQS占调。線程調(diào)用acquire獲取許可,release釋放許可勋磕。若許可數(shù)量小于1妈候,則等待其它線程釋放許可敢靡。

StampedLock

特點:為控制讀寫訪問采用了三種模式挂滓。StampedLock鎖狀態(tài)包含一個版本號和模式。
寫:
讀:
樂觀讀:

LockSupport:阻塞或喚醒一個線程啸胧「险荆基于Unsafe的native實現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纺念,一起剝皮案震驚了整個濱河市贝椿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陷谱,老刑警劉巖烙博,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烟逊,居然都是意外死亡渣窜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門宪躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乔宿,“玉大人,你說我怎么就攤上這事访雪∠耆穑” “怎么了掂林?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坝橡。 經(jīng)常有香客問我泻帮,道長,這世上最難降的妖魔是什么计寇? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任刑顺,我火速辦了婚禮,結(jié)果婚禮上饲常,老公的妹妹穿的比我還像新娘蹲堂。我一直安慰自己,他們只是感情好贝淤,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布柒竞。 她就那樣靜靜地躺著,像睡著了一般播聪。 火紅的嫁衣襯著肌膚如雪朽基。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天离陶,我揣著相機與錄音稼虎,去河邊找鬼。 笑死招刨,一個胖子當著我的面吹牛霎俩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沉眶,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼打却,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谎倔?” 一聲冷哼從身側(cè)響起柳击,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎片习,沒想到半個月后捌肴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡藕咏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年状知,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈离。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡试幽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铺坞,我是刑警寧澤起宽,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站济榨,受9級特大地震影響坯沪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擒滑,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一腐晾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丐一,春花似錦藻糖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柠衍,卻和暖如春洋满,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珍坊。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工牺勾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阵漏。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓驻民,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袱饭。 傳聞我的和親對象是個殘疾皇子川无,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容