Ответ 1
Возможно, InheritableThreadLocal
- это то, что вы ищете?
Я не уверен, что это точно так же, но насколько я понимаю, это соответствует этому требованию:
логический запрос может порождать иерархию новых потоков - и каждый из этих потоков будет иметь доступ к тому же TLS исходного потока.
Из документов
Этот класс расширяет ThreadLocal, чтобы обеспечить наследование значений от родительского потока до дочернего потока: при создании дочернего потока дочерний элемент получает начальные значения для всех наследуемых локальных переменных потока, для которых родитель имеет значения. Обычно дочерние значения будут идентичны родительским; однако дочернее значение может быть сделано произвольной функцией родителя путем переопределения метода childValue в этом классе. Наследуемые потоковые локальные переменные используются в предпочтении к обычным локальным переменным потока, когда атрибут per-thread, поддерживаемый в переменной (например, идентификатор пользователя, идентификатор транзакции), должен автоматически передаваться любым дочерним потокам, которые были созданы.
Я не знаю о возможностях "копировать на запись", о которых вы упомянули, но я думаю, вы можете переопределить InheritableThreadLocal.childValue(T)
, чтобы проксировать родительское значение, чтобы записи не переходили к родительскому и не изменяли текущий поток local хранение