我想在Servlet中出于性能原因重用非线程安全类的实例。我有两个选择,
使用ThreadLocal方法,Servlet环境中存在内存泄漏的可能性。因此,我正在考虑使用第二个选项,我想知道是否有人有使用这种方法的经验和任何使用相同的陷阱?
答案 0 :(得分:1)
首选ThreadLocal方法,因为它可能以正确的粒度同步(或更好,不需要同步),并且不会更大。
如果您使用HashMap推出自己的解决方案,则每次要访问任何线程本地数据时,您都必须获取对HashMap的锁定。为什么?因为可以创建新线程并且线程可以死亡。这些是隐式添加/删除HashMap中的项目,这需要在完整的HashMap上进行同步。你还有很长时间保持对象的生命周期,因为HashMap会保留它包含的所有项目,只要它可以从任何线程引用。这不是ThreadLocal商店的行为方式。
答案 1 :(得分:0)
问题不在于ThreadLocal
本身,而在于它的使用方式。有关详细说明,请参阅here。所以,你自己的实现不会有所作为。