【问题标题】:When would it be advised to use a ThreadLocal singleton instead of a request attribute?什么时候建议使用 ThreadLocal 单例而不是请求属性?
【发布时间】:2025-11-02 13:35:01
【问题描述】:

如果我的 ThreadLocal 单例无论如何都只会在请求的生命周期内存活,那么为什么不直接使用请求属性呢?这只是一种无需通过或获取请求对象即可在单个线程中获取上下文的简单方法吗?

【问题讨论】:

    标签: java servlets httprequest thread-local


    【解决方案1】:

    我的意见是,使用请求属性比使用ThreadLocal 变量更可取。

    它使代码更清晰,您不必担心清理ThreadLocal(因为它可能会在另一个重新使用同一线程的请求的上下文中被重新使用)。

    虽然,通过ThreadLocal 正确设计和编码的本地请求存储很好,如果ThreadLocal 的使用被封装并且您不只是在不同的类之间共享一个实例(并且它的生命周期得到了正确处理)。

    【讨论】:

      【解决方案2】:

      在较大的多层应用程序中,您通常不希望假设工作范围是 Web 请求,或者依赖于较低层内部的固有“Web”事物。如果您将此工作单元作为后台作业执行会怎样?还是通过您最终支持的一些遗留二进制接口到达?

      【讨论】:

      • 这是一个很好的观点。因为它与我目前的工作范围有关,所以它都是基于网络的。
      【解决方案3】:

      使用 ThreadLocal 单例的缺点与在任何其他上下文中使用单例的缺点相同。您将失去封装性、可重用性和模拟功能的能力。

      优点是易于使用、类型安全(无强制转换)和可能的性能(但在整体方案中可能微不足道)。

      我建议不要使用 ThreadLocal 单例,除非功能被很好地封装并且只能在非常高级的代码层中访问(明确地将您的上下文传递到更深层次的类和函数中,而不是让它们访问单例)。

      【讨论】: