ThreadLocal可以在HashMap中用作Key吗?

时间:2017-04-03 11:40:43

标签: java hashmap thread-local

ThreadLocal可以在HashMap中用作Key吗?

如果是这样,它是如何工作的,这通常是一个坏主意?我应该注意什么并注意什么?

2 个答案:

答案 0 :(得分:3)

您可以像任何其他对象一样使用ThreadLocal作为HashMap键。它是否有任何意义是一个不同的主题。

如果您使用可变对象作为HashMapHashSet等内容的键,基本上可能会遇到问题,因为这些类通常使用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