Код: Выделить всё
SecureRandom secureRandom = new SecureRandom();
Iterator idIterator = secureRandom.ints().distinct().iterator();
Код: Выделить всё
SecureRandomОбъекты Код: Выделить всё
Thread t1 = new Thread(() -> idIterator.next());
Thread t2 = new Thread(() -> idIterator.next());
t1.start();
t2.start();
Код: Выделить всё
Exception in thread "Thread-1" java.lang.IllegalStateException: source already consumed or closed
at java.base/java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:409)
at java.base/java.util.stream.AbstractPipeline.lambda$spliterator$0(AbstractPipeline.java:367)
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.init(StreamSpliterators.java:142)
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:157)
at java.base/java.util.stream.StreamSpliterators$IntWrappingSpliterator.tryAdvance(StreamSpliterators.java:358)
at java.base/java.util.Spliterators$2Adapter.hasNext(Spliterators.java:726)
at java.base/java.util.Spliterators$2Adapter.nextInt(Spliterators.java:732)
at java.base/java.util.PrimitiveIterator$OfInt.next(PrimitiveIterator.java:128)
at java.base/java.util.PrimitiveIterator$OfInt.next(PrimitiveIterator.java:86)
at example.Example.foo(Example.java:39)
Код: Выделить всё
NullPointerExceptionПоведение будет таким же, если я ограничу поток и удалю операцию Different():
Код: Выделить всё
secureRandom.ints().limit(100).iterator();
С другой стороны, если я не буду использовать поток и просто вызову SecureRandom.nextInt() из каждого потока, не наблюдается ожидаемого состояния гонки.
Код: Выделить всё
Thread t1 = new Thread(() -> secureRandom.nextInt());
Thread t2 = new Thread(() -> secureRandom.nextInt());
t1.start();
t2.start(); // code is thread-safe
P.S.: Конечно, я могу решить эту проблему, но синхронизируя потоки, получающие следующее значение.
Подробнее здесь: https://stackoverflow.com/questions/651 ... le-threads
Мобильная версия