2016-03-03 198 views
4

在並行流的謂詞函數中有效使用最終的HashSet是否安全?parallelStream中HashSet的線程安全性

如果不是,那麼使用什麼樣的好數據結構?我沒有看到ConcurrentSet ...我想我可以使用ConcurrentHashMap.entrySet()

從我所能收集的內容來看,即使HashSet沒有被修改,最新狀態可能在所有線程中都不可用。但也許有一個簡單的伎倆,使其可用?

List<Integer> items = Stream 
    .of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
    .collect(Collectors.toList()); 

Set<Integer> exclude = Stream 
    .of(5, 10, 15) 
    .collect(Collectors.toSet()); 

List<Integer> filtered = items 
    .parallelStream() 
    .filter(num -> !exclude.contains(num)) 
    .collect(Collectors.toList()); 
+2

是的,應該沒問題。 –

+0

至於線程安全設置,您可以使用'ConcurrentHashMap.newKeySet()'。 –

回答

1

只要您不修改並行線程中的集合,使用您的示例描述的方式應該是完全安全的。