0

出于性能原因,我想在 Servlet 中重用非线程安全类的实例。我有两个选择,

  1. 在 Java 中使用 ThreadLocal 负责对每个线程进行实例管理
  2. 使用使用 Thread 作为 HashMap 键的静态 HashMap,并且在此级别管理实例

使用 ThreadLocal 方法存在内存泄漏的可能性,尤其是在 Servlet 环境中。因此,我正在考虑使用第二个选项,我想知道是否有人有使用这种方法的经验以及使用相同方法的任何陷阱?

4

2 回答 2

2

更喜欢 ThreadLocal 方法,因为它可能以正确的粒度同步(或者更好的是,不需要同步)并且不会更大。

如果您使用 HashMap 推出自己的解决方案,则每次要访问任何线程本地数据时都必须获取 HashMap 的锁。为什么?因为可以创建一个新线程并且线程可以死亡。这些是从 HashMap 中隐式添加/删除项目,这需要在完整的 HashMap 上进行同步。您还将有相当长的时间保持对象的生命周期,因为 HashMap 将保持它包含的所有项目,只要它可以从任何线程引用。这不是 ThreadLocal 存储的行为方式。

于 2013-09-19T02:29:02.183 回答
0

问题不在于ThreadLocal它本身,而在于它的使用方式。有关详细说明,请参见此处。因此,您自己的实现不会有所作为。

于 2013-09-19T02:15:31.910 回答