更新時間:2023年04月10日10時11分 來源:傳智教育 瀏覽次數(shù):
Java8中的ConcurrentHashMap通過使用一種稱為“分離鎖”的技術,摒棄了Java7及之前版本中使用的分段鎖機制。
在Java7及之前版本中,ConcurrentHashMap被分成一些段,每個段上有一個獨立的鎖來控制對該段的訪問。這樣的做法能夠提高并發(fā)性能,但是也存在一些問題,比如:
·同時只有一個線程能夠修改一個段中的數(shù)據(jù),當多個線程嘗試修改同一段中的數(shù)據(jù)時,需要通過競爭該段上的鎖來獲取訪問權限,這會導致一定程度的競爭和等待,降低并發(fā)性能。
·當需要擴容時,需要重新分配段數(shù)組,并將原有數(shù)據(jù)復制到新數(shù)組中。這個過程需要停止所有的讀寫操作,并持有整個ConcurrentHashMap的全局鎖,會導致所有的線程都被阻塞,對性能有很大的影響。
為了解決這些問題,Java8中的ConcurrentHashMap采用了“分離鎖”的技術。具體來說,ConcurrentHashMap內(nèi)部維護了一些獨立的桶,每個桶上有一個獨立的鎖,每個鎖只保護對應的桶上的數(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使用了默認的構造函數(shù)創(chuàng)建,表示內(nèi)部不包含任何元素。接著通過put方法向ConcurrentHashMap中添加了三個鍵值對。最后使用getOrDefault方法獲取鍵值對中鍵為"D"的值,由于該鍵不存在,返回了默認值0。