Означает ли спецификация, что все операции над последовательными потоками Java выполняются в текущем потоке? (За исключением "forEach" и "forEachOrdered")
Я явно прошу спецификацию, а не то, что делает текущая реализация. Я могу самостоятельно изучить текущую реализацию и не беспокоить вас этим. Но реализация может измениться, и есть другие реализации.
Я спрашиваю из-за ThreadLocals: я использую Framework, который использует ThreadLocals внутри. Даже простой вызов типа company.getName() в конечном итоге использует ThreadLocal. Я не могу изменить, как эта структура разработана. По крайней мере, не в разумные сроки.
Спецификация кажется запутанной здесь. В документации пакета "java.util.stream" указано:
Если поведенческие параметры имеют побочные эффекты, если не указано явно, то нет никаких гарантий относительно видимости этих побочных эффектов для других потоков, и нет никаких гарантий того, что разные операции над "одним и тем же" элементом в одном и том же поточном конвейере выполняются в одном потоке.
...
Даже когда конвейер ограничен для получения результата, который согласуется с порядком встречи источника потока (например, IntStream.range(0,5).parallel(). Map (x → x * 2).toArray( ) должен производить [0, 2, 4, 6, 8]), никаких гарантий не делается относительно порядка, в котором функция сопоставления применяется к отдельным элементам, или в каком потоке выполняется какой-либо поведенческий параметр для данного элемента.
Я бы это интерпретировал так: Каждая операция в потоке может произойти в другом потоке. Но документация "forEach" и "forEachOrdered" явно заявляет:
Для любого данного элемента действие может выполняться в любое время и в любом потоке, который выбирает библиотека.
Это утверждение будет избыточным, если каждая операция потока может произойти в неуточненном потоке. Таким образом, верно противоположное: все операции над последовательным потоком гарантируются в текущем потоке, за исключением "forEach" и "forEachOrdered"?
У меня есть googled для авторитетного ответа о комбинации "Java", "Stream" и "ThreadLocal", но ничего не нашел. Близкое дело было ответом Брайана Гетца на связанный с этим вопрос здесь на Stack Overflow, но речь идет о порядке, а не о потоке, и речь идет только о "forEach", а не о других методах потока: Does Stream.forEach уважают определить порядок последовательных потоков?