摘要:并發(fā)數(shù)據(jù)結構存在的理由串行數(shù)據(jù)結構在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會帶來性能的影響,所以專門設計了針對并發(fā)環(huán)境下的數(shù)據(jù)結構,其中使用了無鎖運算來保證性能。在高并發(fā)的情況下過多的鎖操作會拖累系統(tǒng)的性能。是由數(shù)組結構和數(shù)組結構組成。
【并發(fā)數(shù)據(jù)結構存在的理由
串行數(shù)據(jù)結構在并發(fā)環(huán)境下是不安全的,而直接使用鎖又會帶來性能的影響,所以jdk專門設計了針對并發(fā)環(huán)境下的數(shù)據(jù)結構,其中使用了無鎖運算來保證性能。
【并發(fā)List1.可以直接使用Collections.synchronizedList()將一個非線程安全的list變成支持同步的list.但是這樣做有一個問題,就是所有的操作都會被加上鎖,我們知道如果只有讀操作是不需要上鎖的。
2..CopyOnWriteArrayList:使用了無鎖計算,即當對象進行寫操作時,復制該對象;若進行讀,則直接返回結果,操作過程中不進行同步。這很好的利用了對象的不變性,在沒有對對像進行寫操作之前,由于對象未發(fā)生改變,因此不需要加鎖。而在試圖改變對象的時候,總是先獲得一個對象的副本,然后對副本進行操作,最后將副本寫回。這種實現(xiàn)方式的核心思想時減少競爭,從而提高在高并發(fā)時的讀取性能。但是在一定程度上犧牲了寫的性能。
3.Vector:使用了同步關鍵字,所有的get操作都需要先獲得鎖才能進行。在高并發(fā)的情況下過多的鎖操作會拖累系統(tǒng)的性能。
結論:在讀多寫少的環(huán)境下,使用CopyOnWriteArrayList可以提高性能,但是在寫多讀少的環(huán)境下,應該使用vector.
【并發(fā)set與list相似,并發(fā)set也有一個CopyOnWriteArraySet,它實現(xiàn)了set接口,并且是線程安全的,它的內部完全依賴CopyOnWriteArrayList,因此它的特征和CopyOnWriteArrayList一致,適用于讀多寫少的環(huán)境,如果是寫多讀少的環(huán)境可以使用Collections.synchronizedSet()得到一個線程安全的set。
【并發(fā)map同理獲得一個線程安全的map也可以使用Collections.synchronizedMap(),但是在高并發(fā)的環(huán)境下這個map的性能不是最佳的。Jdk專門提供了一個cocurrentHashMap來支持高并發(fā)。而cocurrentHashMap之所以如此強大,是因為:
1. 其內部實現(xiàn)了鎖分離。 2. get()操作也是無鎖的。【cocurrentHashMap:
ConcurrentHashMap是由Segment數(shù)組結構和HashEntry數(shù)組結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色,HashEntry則用于存儲鍵值對數(shù)據(jù)。一個ConcurrentHashMap里包含一個Segment數(shù)組,Segment的結構和HashMap類似,是一種數(shù)組和鏈表結構, 一個Segment里包含一個HashEntry數(shù)組,每個HashEntry是一個鏈表結構的元素, 每個Segment守護者一個HashEntry數(shù)組里的元素,當對HashEntry數(shù)組的數(shù)據(jù)進行修改時,必須首先獲得它對應的Segment鎖。
而HashTable則是使用了內部鎖,所有的操作全部都需要獲得內部鎖才能得以執(zhí)行。
但是呢,使用所分離這樣的技術也有一個缺點:當需要統(tǒng)計全局變量時(比如count),我們需要獲得所有分段鎖才能夠執(zhí)行。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/68087.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:介紹中無鎖的線程安全整數(shù),一個提供原子操作的的類。在語言中,和操作并不是線程安全的,在使用的時候,不可避免的會用到關鍵字。而則通過一種線程安全的加減操作接口。就是的意思,比較并操作。有個操作數(shù),內存值,舊的預期值,要修改的新值。 【介紹 JAVA 中無鎖的線程安全整數(shù) AtomicInteger,一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的...
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
閱讀 854·2021-08-23 09:46
閱讀 1003·2019-08-30 15:44
閱讀 2657·2019-08-30 13:53
閱讀 3110·2019-08-29 12:48
閱讀 3969·2019-08-26 13:46
閱讀 1888·2019-08-26 13:36
閱讀 3574·2019-08-26 11:46
閱讀 1501·2019-08-26 10:48