教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java8開始ConcurrentHashMap,為什么舍棄分段鎖?

更新時間:2023年04月10日10時11分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  Java8中的ConcurrentHashMap通過使用一種稱為“分離鎖”的技術(shù),摒棄了Java7及之前版本中使用的分段鎖機制。

  在Java7及之前版本中,ConcurrentHashMap被分成一些段,每個段上有一個獨立的鎖來控制對該段的訪問。這樣的做法能夠提高并發(fā)性能,但是也存在一些問題,比如:

  ·同時只有一個線程能夠修改一個段中的數(shù)據(jù),當多個線程嘗試修改同一段中的數(shù)據(jù)時,需要通過競爭該段上的鎖來獲取訪問權(quán)限,這會導(dǎo)致一定程度的競爭和等待,降低并發(fā)性能。

  ·當需要擴容時,需要重新分配段數(shù)組,并將原有數(shù)據(jù)復(fù)制到新數(shù)組中。這個過程需要停止所有的讀寫操作,并持有整個ConcurrentHashMap的全局鎖,會導(dǎo)致所有的線程都被阻塞,對性能有很大的影響。

  為了解決這些問題,Java8中的ConcurrentHashMap采用了“分離鎖”的技術(shù)。具體來說,ConcurrentHashMap內(nèi)部維護了一些獨立的桶,每個桶上有一個獨立的鎖,每個鎖只保護對應(yīng)的桶上的數(shù)據(jù)。

  這種做法的好處是:

  ·多個線程可以同時訪問不同的桶,避免了對同一段鎖的競爭。

  ·當需要擴容時,只需要對需要擴容的桶進行操作,不需要持有全局鎖,可以保證其他桶的并發(fā)訪問不受影響。

  以下是Java8中ConcurrentHashMap的簡單代碼示例:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

int value = map.getOrDefault("D", 0);
System.out.println(value); // 輸出0

  在上述代碼中,ConcurrentHashMap使用了默認的構(gòu)造函數(shù)創(chuàng)建,表示內(nèi)部不包含任何元素。接著通過put方法向ConcurrentHashMap中添加了三個鍵值對。最后使用getOrDefault方法獲取鍵值對中鍵為"D"的值,由于該鍵不存在,返回了默認值0。

0 分享到:
和我們在線交談!