2017-04-03 1 views
1

Est-ce que ThreadLocal peut être utilisé comme clé dans HashMap?Est-ce que ThreadLocal peut être utilisé comme clé dans HashMap?

Si oui, comment cela fonctionne-t-il et est-ce généralement une mauvaise idée? Que dois-je regarder et être au courant?

+0

Cela semble être une très mauvaise idée. L'instance de 'ThreadLocal' n'est pas destinée à être utilisée de cette façon et beaucoup dépend de sa méthode' equals' qui pourrait potentiellement donner des résultats différents en fonction du thread appelé. Pourquoi n'utilisez-vous pas simplement la valeur que ThreadLocal contient? –

+0

Cette question est bizarre. D'un côté, c'est une idée bizarre. D'un autre côté, c'est tellement bizarre que j'ai commencé à m'interroger à ce sujet. Malheureusement, ce n'est pas le genre de question qui devrait être posée ici. Voir: http://stackoverflow.com/help/on-topic et http://stackoverflow.com/help/dont-ask –

+4

Après avoir regardé rapidement, je vois que ThreadLocal n'implémente pas equals et Méthodes 'hashCode'. Donc ça ne marchera pas. –

Répondre

3

Vous pouvez utiliser ThreadLocal comme clé HashMap comme n'importe quel autre objet. Qu'il ait un sens est un sujet différent.

Fondamentalement, vous pouvez avoir des problèmes si vous utilisez un objet mutable comme une clé pour des choses comme HashMap, HashSet et ainsi de suite, parce que ces classes utilisent généralement hashCode() (d'où le nom) pour mettre des choses dans des seaux et le récupérer. Donc, si vous utilisez un objet mutable comme une clé, puis changez l'objet (d'une certaine manière le hashCode change) et essayez ensuite de récupérer l'entrée par clé, vous ne trouverez plus l'entrée car la carte apparaîtra dans le mauvais emplacement. l'entrée.

Dans le cas de ThreadLocal ce ne serait pas un problème, car il ne l'emportait pas sur equals() et hashCode() et donc la hashCode() ne changera pas si vous changez l'objet, de sorte que vous pourrait utiliser en toute sécurité la ThreadLocal comme la clé.

1

Comme Jaroslaw Pawlak a commenté, depuis ThreadLocal n'implémente pas hashCode() et equals() il ne convient pas à la clé dans HashMap, au moins si vous vous attendez à être bien comportés.

Même si c'était le cas, ce serait inutile. Considérant le cas d'utilisation de ThreadLocal, il serait beaucoup plus clair d'utiliser l'objet contenu comme clé. Avoir une carte avec un mappage ThreadLocal (avec un contenu spécifique au thread) finit par avoir la carte interne de ThreadLocal (celle qui mappe le fil sur la valeur) utilisée pour les mappages réels.

Pour ne pas mentionner que ThreadLocal instances sont quelque peu recommandé contre. Les cas d'utilisation courants qu'ils ont sont résolus en introduisant des classes threadlocal "natives", telles que java.util.concurrent.ThreadSafeRandom.

+1

Quel est le problème avec le comportement d'un objet qui ne remplace pas 'hashCode' et "est égal"? C'est simplement une carte de hachage basée sur l'identité. Il se comporte parfaitement si vous utilisez le même objet. – RealSkeptic

+0

@RealSkeptic exactement, donc je dirais que cette réponse est fausse.:-) – Vampire

+0

Parce que si vous voulez 'IdentityHashMap', vous devriez l'utiliser explicitement. Utiliser un 'HashMap' régulier avec un' ThreadLocal' supplémentaire weirdery est juste une programmation peu claire. – Kayaman