1

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

4

3 回答 3

2

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

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

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

于 2012-04-27T17:47:00.470 回答
1

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

于 2012-04-27T17:53:48.663 回答
1

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

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

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

于 2012-04-27T17:56:29.020 回答