Użyłem parallelStream, aby uzyskać najdłuższy ciąg w tablicy, kod jest następujący, za każdym razem, gdy działa, otrzymuję inny wynik. AtomicReference
zakłada, że jest bezpieczny dla wątków, nawet jeśli jest używany w środowisku parallelStream? Ale dlaczego tak się dzieje?Czy wątek AtomicReference java jest bezpieczny podczas używania w ramach parallelStream?
public static void main(String[] args) {
AtomicReference<String> longest = new AtomicReference<>();
LongAccumulator accumulator = new LongAccumulator(Math::max, 0);
List<String> words = Arrays.asList("him", "he", "thanks", "strings", "congratulations", "platform");
words.parallelStream().forEach(
next -> longest.updateAndGet(
current -> {
String result = next.length() > accumulator.intValue() ? next : current;
accumulator.accumulate(next.length());
return result;
}
)
);
System.out.println(longest.get());
}
po raz pierwszy wydrukowano "gratulacje", a czasem wydrukowano "platformę".
Czy jest możliwość, aby użyć 'words.parallelStream() max (Comparator.comparingInt (String :: długość));' zamiast..? Próbowałem tego i zawsze zwracałem to samo słowo. Jednak nie jestem w 100% pewien, czy zostanie wykonany równolegle. – Clayn
@Clayn: to jest problem ze współbieżnością - nigdy nie możesz być tego pewien. Ale mogę was zapewnić, że wasz wariant jest poprawny. – Holger
@ Dziękujemy dzięki za twierdzenie. Pierwszą rzeczą, która przyszła mi do głowy, było: jestem pewien, że można to zrobić bardziej elegancko, używając Stream API – Clayn