ThreadLocal可以在HashMap中用作Key吗?
如果是这样,它是如何工作的,这通常是一个坏主意?我应该注意什么并注意什么?
答案 0 :(得分:3)
您可以像任何其他对象一样使用ThreadLocal
作为HashMap键。它是否有任何意义是一个不同的主题。
如果您使用可变对象作为HashMap
,HashSet
等内容的键,基本上可能会遇到问题,因为这些类通常使用hashCode()
(因此名称)将东西放入桶中并检索它。因此,如果您使用可变对象作为键,然后更改对象(以hashCode更改的方式),然后尝试按键检索条目,您将不再找到该条目,因为地图将在错误的存储桶中查找条目。
对于ThreadLocal
,这不会有问题,因为它不会覆盖equals()
和hashCode()
,因此如果您更改了hashCode()
,则ThreadLocal
不会改变对象,因此可以安全地使用keybidings.json
作为密钥。
答案 1 :(得分:1)
正如Jaroslaw Pawlak评论的那样,由于ThreadLocal
未实现hashCode()
和equals()
,因此不适合HashMap
中的键,至少如果你期望它表现良好。
即使它确实如此,也没用。考虑ThreadLocal
的用例,使用包含的对象作为密钥将更加清晰。
拥有一个ThreadLocal
(具有特定于线程的内容)映射的映射最终会使内部映射ThreadLocal
(将线程映射到值的映射)用于实际映射。
更不用说推荐使用ThreadLocal
个实例了。他们的常见用例通过引入“本地”threadlocal类来解决,例如java.util.concurrent.ThreadSafeRandom
。