Comments 4
Насчёт MDC там не так все радужно, на самом деле. API ScopedValue подразумевает, что хранимое значение неизменяемо и может быть только переопределено во вложенных скоупах.
А MDC внутри содержит HashMap, соответственно там между сабтасками может быть неразбериха (если они пишут в MDC).
Я как-то экспериментировал и писал адаптеры для MDC и SpringSecurity для поддержки StructuredScope и ScopedValues (чтобы код оставался таким же простым как в примерах из JEP) и (не знаю как сейчас, может за год изменилось что) там все равно нужно было писать обёртку, чтобы каждая подзадача получила свою копию MDC, либо гарантировать что в подзадаче никогда не будет вызываться MDC.put, а только та его версия, что использует стек внутри.
Выглядит интересно. Хотелось бы, чтобы API был бы более foolproof. Например, пользователь может вызвать fork
после join
или не вызвать join
вообще - в этих случаях будет ошибка. Да - сам виноват, но может быть можно было бы защититься и от этого.
Structured Concurrency в Java: наконец-то находит опору