1. 程式人生 > >在Java中構建執行緒安全的Set

在Java中構建執行緒安全的Set

我們常用的HashSet、TreeSet都是執行緒不安全的,在JDK1.8中ConcurrentHashMap類中新增了兩個方法,第二個方法是多帶了一個初始大小的變數。


public static KeySetView newKeySet() {

return new KeySetView

(new ConcurrentHashMap(), Boolean.TRUE);

}

public static KeySetView newKeySet(int initialCapacity) {

return new KeySetView

(new ConcurrentHashMap(initialCapacity), Boolean.TRUE);

}

但是,在實際專案中,我們的jdk一直是1.7,所以該方法用不了,而Java中很多Set都是通過在內部構造一個Map來實現對應的Set,如HashSet內部就有一個HashMap變數,所以,自然想到是否能通過借鑑HashSet的構造創建出一個執行緒安全的Set。
通過查閱jdk1.7的文件,發現java.util.Collections類中newSetFromMap方法可以返回一個基於指定map的set,該set與指定map具有相同的併發和效能特徵。

public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
        return new SetFromMap<>(map);
 }

在使用該方法時有幾點需要注意的:
1.作為引數傳遞進去的map必須為空的,否則會報IllegalArgumentException
2.最後我們通過該方法實現生成一個執行緒安全的Set,具體程式碼如下

  Set<E> concurrentHashSet = Collections.newSetFromMap()



作者:sunbigtree
連結:https://www.jianshu.com/p/ecda9f22a516
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授