Подтвердить что ты не робот

Что такое эквивалент Java С# "Контекст логического вызова"

В .net существует "uber" поток-локальное хранилище (TLS), которое позволяет произвольным данным TLS автоматически "перескакивать" из одного потока в другой. Он основан на классе CallContext.

Иными словами, логический запрос может порождать иерархию новых потоков - и каждый из этих потоков будет иметь доступ к тому же TLS исходного потока. Это очень мощная функция, особенно для ведения журналов, авторизации, многопользовательских или брендинговых проблем.

Что такое эквивалент в Java?

Только в .net 4.5 "логический callcontext" получил возможность "копирования на запись" , которая позволяет потокам вносить частные изменения в логический callcontext. Другими словами,.net все еще созревает в этой возможности и обеспечивает большую стабильность.

Если у Java есть эквивалентное понятие, насколько это стабильно? Какие проблемы у него есть?

Разъяснение

Я уже знаю, что Java имеет возможность локального хранилища потоков (TLS). Дело не в этом. Я спрашиваю, имеет ли Java эквивалент "контекста логического вызова .net", который является гораздо более мощной конструкцией, чем простой TLS.

4b9b3361

Ответ 1

Возможно, InheritableThreadLocal - это то, что вы ищете?

Я не уверен, что это точно так же, но насколько я понимаю, это соответствует этому требованию:

логический запрос может порождать иерархию новых потоков - и каждый из этих потоков будет иметь доступ к тому же TLS исходного потока.

Из документов

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

Я не знаю о возможностях "копировать на запись", о которых вы упомянули, но я думаю, вы можете переопределить InheritableThreadLocal.childValue(T), чтобы проксировать родительское значение, чтобы записи не переходили к родительскому и не изменяли текущий поток local хранение

Ответ 2

Я не знаком с .net, но из вашего описания самое близкое, о чем я мог подумать, было ThreadLocal.

Однако я нашел статью, которую вы можете найти полезной.

https://dzone.com/articles/thread-local-storage-java