更新時(shí)間:2023年04月10日10時(shí)11分 來(lái)源:傳智教育 瀏覽次數(shù):
Java8中的ConcurrentHashMap通過(guò)使用一種稱(chēng)為“分離鎖”的技術(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。
北京校區(qū)