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