112 votes

Pourquoi Java ThreadLocal des variables statiques

J'ai lu qu'JavaDoc pour Threadlocal ici

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

et il dit "ThreadLocal instances sont généralement privés de champs statiques dans les classes qui souhaitent associer état avec un filetage (par exemple, un ID d'utilisateur ou ID de Transaction). "

Mais ma question est: pourquoi ont-ils le choix de la rendre statique (généralement) - il fait un peu déroutant d'avoir "par sujet" etat, mais sa statique?

143voto

Affe Points 24993

Parce que si il s'agissait d'une instance de niveau de champ, alors il serait effectivement "Par Thread - Par Exemple", pas seulement une garantie "Par Thread." Qui n'est pas normalement, la sémantique vous êtes à la recherche pour.

Habituellement, c'est quelque chose d'objets qui sont limités à un Utilisateur de Conversation, Demande Web, etc. Vous ne voulez pas eux aussi sous la portée de l'instance de la classe.
Une requête web => une Persistance de session.
Pas une requête web => une persistance de session par objet.

21voto

Adnan Memon Points 103

Soit le rendre statique ou si vous êtes en essayant d'éviter les champs statiques dans votre classe - faire de la classe elle-même un singleton, et puis vous pouvez les utiliser en toute sécurité l'une instance de niveau ThreadLocal aussi longtemps que vous avez que singleton disponible dans le monde entier.

13voto

irreputable Points 25577

Il n'a pas à être. L'important, c'est qu'il doit être un singleton.

3voto

Ukko Points 1658

La raison en est que les variables sont accessibles via un pointeur associé avec le fil. Ils agissent comme des variables globales avec du fil portée, et par conséquent statique est le plus proche de l'ajustement. C'est la façon dont vous obtenez thread local de l'état dans des choses comme les pthreads donc c'est peut-être juste un accident de l'histoire et de la mise en œuvre.

1voto

Chris Mawata Points 11

Une utilisation pour un threadlocal par exemple par thread est que si vous voulez quelque chose pour être visible dans toutes les méthodes d'un objet et l'avoir thread-safe, sans synchronisation d'accès à elle comme vous le feriez donc pour un champ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X