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

全國(guó)咨詢/投訴熱線:400-618-4000

Java8開(kāi)始ConcurrentHashMap,為什么舍棄分段鎖?

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

好口碑IT培訓(xùn)

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

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

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

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

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

  這種做法的好處是:

  ·多個(gè)線程可以同時(shí)訪問(wèn)不同的桶,避免了對(duì)同一段鎖的競(jìng)爭(zhēng)。

  ·當(dāng)需要擴(kuò)容時(shí),只需要對(duì)需要擴(kuò)容的桶進(jìn)行操作,不需要持有全局鎖,可以保證其他桶的并發(fā)訪問(wèn)不受影響。

  以下是Java8中ConcurrentHashMap的簡(jiǎn)單代碼示例:

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

0 分享到:
和我們?cè)诰€交談!