什么是 Java 等同于 C# 的“逻辑调用上下文”

2022-09-01 07:53:11

在.net中,有一个“uber”线程本地存储(TLS),它允许任意TLS数据自动神奇地从一个线程“跳转”到另一个线程。它基于 CallContext 类

换句话说,逻辑请求可以生成新线程的层次结构 - 并且每个线程都将有权访问原始线程的相同TLS。这是一个非常强大的功能,特别是对于日志记录,授权,多租户或品牌问题。

Java中的等效项是什么?

只有在 .net 4.5 中,“逻辑调用上下文”才获得了“写入时复制”功能,该功能允许线程对逻辑调用上下文进行私有修改。换句话说,.net 仍在使此功能成熟,并提供更高的稳定性。

如果Java有一个等效的概念,那么它的稳定性如何?它有什么问题?

澄清

我已经知道Java具有线程本地存储(TLS)功能。这不是问题所在。我问Java是否具有.net的“逻辑调用上下文”的等效物,这是一个比简单的TLS更强大的结构。


答案 1

也许 InheritableThreadLocal 就是你要找的?

我不确定它是否完全相同,但据我所知,它符合此要求:

逻辑请求可以生成新线程的层次结构 - 并且每个线程都将有权访问原始线程的同一TLS。

从文档

此类扩展 ThreadLocal 以提供从父线程到子线程的值的继承:创建子线程时,子线程接收父线程具有值的所有可继承线程局部变量的初始值。通常,孩子的值将与父母的值相同;但是,通过重写此类中的子值方法,可以将子值作为父值的任意函数。当变量中维护的每线程属性(例如,用户 ID、事务 ID)必须自动传输到创建的任何子线程时,可继承的线程局部变量优先于普通线程局部变量。

我不知道你提到的“写入时复制”功能,但我想你可以覆盖以代理父级的值,这样写操作就不会通过父级并修改当前线程的本地存储InheritableThreadLocal.childValue(T)


答案 2

我不熟悉.net,但从您的描述中,我能想到的最接近的东西是.ThreadLocal

但是,我发现了一篇您可能会发现有用的文章。

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