使用ThreadLocal与HashMap一起使用Thread作为键

时间:2013-09-19 02:10:56

标签: java servlets concurrency thread-safety

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

  1. 使用ThreadLocal,其中Java负责每个线程进行实例管理
  2. 使用静态HashMap,它使用Thread作为HashMap键,实例在此级别进行管理
  3. 使用ThreadLocal方法,Servlet环境中存在内存泄漏的可能性。因此,我正在考虑使用第二个选项,我想知道是否有人有使用这种方法的经验和任何使用相同的陷阱?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

问题不在于ThreadLocal本身,而在于它的使用方式。有关详细说明,请参阅here。所以,你自己的实现不会有所作为。