繁体   English   中英

使用ThreadLocal与带有Thread作为键的HashMap

[英]Using ThreadLocal vs. a HashMap with Thread as a key

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

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

使用ThreadLocal方法时,在Servlet环境中存在内存泄漏的可能性,特别是在其中。 因此,我正在考虑使用第二个选项,我想知道是否有人在使用此方法方面有经验,并且有使用相同方法的陷阱?

最好选择ThreadLocal方法,因为它可能以正确的粒度而不是更大的大小同步(或更好,不需要同步)。

如果使用HashMap推出自己的解决方案,则每次访问任何本地线程数据时,都必须获得对HashMap的锁定。 为什么? 因为可以创建新线程并且线程可能死掉。 这些是从HashMap隐式添加/删除项目,这需要在完整的HashMap上进行同步。 您还将有足够的时间保持对象的生存期,因为HashMap会保持生存状态,只要它可以从任何线程引用即可。 这不是ThreadLocal存储的行为。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM