web-dev-qa-db-fra.com

Je suis confus sur l'utilisation de la méthode statique dans multithreading java?

quelque chose à propos de statique:

  • instances de la méthode statique de partage de classe

les questions similaires:

Je suis déroutant à propos de:

  • méthode statique juste avoir un seul bloc de mémoire?
  • si j'utilise la méthode statique en multithreading, est-ce qu'il va bloquer
8
freeeze king

Je suis déroutant à propos de:

méthode statique juste avoir un seul bloc de mémoire? si j'utilise la méthode statique en multithreading, ça va bloquer

Le mot clé static en Java signifie simplement "sans égard ni connaissance d'aucune instance particulière d'un objet".

Une méthode d'instance peut utiliser this pour accéder aux champs de son instance associée, mais une méthode statique n'a pas d'instance associée et donc this n'a aucun sens.

En multithreading, la sécurité des threads implique de protéger la cohérence et l'intégrité des données mutables. Comme les objets encapsulent l'état de leurs champs d'instance, les méthodes d'instance doivent uniquement se préoccuper de la sécurité des threads dans les cas où plusieurs threads accéderont au même objet.

Ainsi, alors que le confinement de threads d'un objet est une politique de sécurité de thread valide pour les instances d'une classe, ce même raisonnement n'est pas valable pour les méthodes statiques car elles ne possèdent pas d'instance. 

Cela n'a rien à voir avec des blocs de mémoire. Cela a juste à voir avec l'accès. Une instance d'objet est accessible via une référence. Si la référence est un thread confiné, l'objet sur lequel cette référence pointe sera toujours thread-safe. Cependant, tout thread pouvant accéder à votre classe peut potentiellement atteindre ses membres statiques, car aucune référence à une instance n'est nécessaire pour les utiliser.

Les méthodes statiques ne sont pas bloquantes par défaut. Vous pouvez implémenter votre propre stratégie de sécurité de thread/synchronisation et bloquer votre méthode statique si vous le souhaitez.

9
scottb

méthode statique juste avoir un seul bloc de mémoire?

Non, les méthodes n'ont pas de blocs de mémoire. Les threads exécutant ces méthodes le font. Chaque thread aura sa propre mémoire sur la pile où il stockera tous les arguments et variables de la méthode. 

si j'utilise la méthode statique en multithreading, ça va bloquer

Un thread ne peut pas accéder à la mémoire d'un autre thread, mais si une ressource appartient à toutes les instances et est supposée être accessible séquentiellement, vous pouvez synchroniser ou verrouiller la méthode statique, ce qui en fait une méthode bloquante. Sinon, non.

6
YoungSpice

Chaque thread a son propre espace de pile, chaque fois qu'il appelle une méthode (statique ou virtuelle) qui appelle, alloue un cadre de pile contenant les variables locales. rien à ce sujet n'est spécifique aux méthodes statiques.

Les méthodes statiques peuvent être appelées simultanément par plusieurs threads, à moins que vous ne fassiez spécifiquement quelque chose pour empêcher cela, par exemple demander à l'appelant d'acquérir un verrou (par exemple, en utilisant le mot clé synchronized).

Regardez des exemples de classes avec des méthodes statiques, comme Java.lang.Math. Ses méthodes sont sans état, aucun verrouillage n'est donc nécessaire. Les méthodes statiques conviennent aux cas où il n'y a pas d'état partagé. Ils peuvent être corrects dans les cas d’accès ou de modification de l’état partagé threadsafe, en fonction du niveau de simultanéité requis et de l’efficacité des fonctionnalités accédées par threadsafe. (Attention aux goulots d'étranglement.)

Placer le mot clé synchronized sur une méthode statique peut être un problème car cela limite votre application à l'appeler avec un seul thread à la fois. Des stratégies alternatives, telles que l’utilisation d’objets atomiques, l’utilisation de structures de données threadsafe conçues pour une grande concurrence, ou le confinement de threads, peuvent être préférables au verrouillage.