一個(gè)人能建設(shè)一個(gè)公司網(wǎng)站嗎短視頻seo是什么
1.?Segment 數(shù)組
ConcurrentHashMap 內(nèi)部維護(hù)一個(gè) Segment 數(shù)組,每個(gè) Segment 都是一個(gè)小型的 HashMap。Segment 繼承自 ReentrantLock,因此每個(gè) Segment 都是一個(gè)可重入鎖。
2.?并發(fā)級(jí)別
ConcurrentHashMap 在構(gòu)造時(shí)可以指定并發(fā)級(jí)別(concurrencyLevel),該值決定了 Segment 數(shù)組的大小。默認(rèn)情況下,并發(fā)級(jí)別為 16。
3.?hash 分段
當(dāng)向 ConcurrentHashMap 中添加元素時(shí),首先根據(jù) key 的 hash 值確定該元素屬于哪個(gè) Segment。這樣可以將鎖的粒度縮小到 Segment 級(jí)別,而不是整個(gè) Map。
4.?鎖定 Segment
在對(duì)某個(gè) Segment 進(jìn)行寫操作時(shí),需要獲取該 Segment 的鎖。讀操作則不需要加鎖,因?yàn)樽x操作是在 Segment 內(nèi)部進(jìn)行的。
5.?擴(kuò)容
當(dāng)某個(gè) Segment 中的元素?cái)?shù)量超過(guò)閾值時(shí),該 Segment 會(huì)進(jìn)行擴(kuò)容。擴(kuò)容時(shí),需要獲取該 Segment 的鎖,以確保線程安全。
性能優(yōu)化怎么做的?
1.?分段鎖(Segment Locking)
ConcurrentHashMap 將整個(gè)哈希表分成多個(gè) Segment,每個(gè) Segment 是一個(gè)獨(dú)立的鎖。這樣,多個(gè)線程可以并發(fā)地訪問(wèn)不同的 Segment,從而減少了鎖的競(jìng)爭(zhēng)。
- 鎖粒度: 通過(guò)將鎖的粒度從整個(gè) Map 降低到每個(gè) Segment,ConcurrentHashMap 允許多個(gè)線程同時(shí)對(duì)不同的 Segment 進(jìn)行讀寫操作。
- 并發(fā)級(jí)別: 在構(gòu)造 ConcurrentHashMap 時(shí),可以指定并發(fā)級(jí)別(concurrencyLevel),這決定了 Segment 的數(shù)量。默認(rèn)值為 16,意味著最多可以有 16 個(gè)線程同時(shí)進(jìn)行寫操作。
2.?無(wú)鎖讀操作
在讀操作時(shí),ConcurrentHashMap 不需要加鎖。它使用了以下機(jī)制來(lái)確保線程安全和數(shù)據(jù)一致性:
- 使用 volatile 變量: 讀操作直接讀取數(shù)據(jù),使用 volatile 關(guān)鍵字確保內(nèi)存可見(jiàn)性。這樣,即使在沒(méi)有鎖的情況下,其他線程對(duì)數(shù)據(jù)的修改也能被及時(shí)看到。
- 快速訪問(wèn): 由于讀操作不需要加鎖,多個(gè)線程可以快速地并發(fā)讀取數(shù)據(jù),極大地提高了讀操作的性能。
3.?CAS 操作(Compare-And-Swap)
在寫操作中,ConcurrentHashMap 使用 CAS 操作來(lái)更新數(shù)據(jù),這是一種無(wú)鎖的并發(fā)控制機(jī)制。
- 原子性更新: CAS 操作可以在不加鎖的情況下安全地更新值。它通過(guò)比較當(dāng)前值和預(yù)期值,如果相同則更新為新值,從而確保了原子性。
- 減少鎖競(jìng)爭(zhēng): 通過(guò)使用 CAS,ConcurrentHashMap 能夠在高并發(fā)環(huán)境下減少鎖的競(jìng)爭(zhēng),從而提高性能。
4.?擴(kuò)容機(jī)制
ConcurrentHashMap 的擴(kuò)容設(shè)計(jì)也經(jīng)過(guò)了優(yōu)化,以支持高效的并發(fā)擴(kuò)容。
- 分段擴(kuò)容: 當(dāng)某個(gè) Segment 的元素?cái)?shù)量超過(guò)閾值時(shí),僅擴(kuò)容該 Segment,而不是整個(gè) Map。這避免了在擴(kuò)容期間對(duì)整個(gè) Map 的鎖定。
- 并發(fā)擴(kuò)容: 在擴(kuò)容過(guò)程中,允許多個(gè)線程同時(shí)進(jìn)行擴(kuò)容操作。通過(guò)將擴(kuò)容過(guò)程分散到多個(gè)線程,減少了擴(kuò)容帶來(lái)的性能影響。