2016-03-03 2 views
4

Можно ли эффективно использовать окончательный HashSet в функции предиката параллельного потока?Безопасность потока HashSet в параллельном потокеStream

Если нет, то какая хорошая структура данных для использования? Я не вижу 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

Пока вы не изменяете набор в параллельных потоках, должно быть совершенно безопасно использовать способ, описанный в вашем примере.