Question

Je voudrais demander si Java utilisera plus de ressources CPU lorsque les threads sont bloqués, c'est-à-dire en attendant de verrouiller un moniteur qui est actuellement verrouillé par un autre thread.

Je regarde maintenant un vidage de fil par lequel certains fils sont bloqués car ils attendent de verrouiller un moniteur, et je ne sais pas si c'est ce qui peut être responsable de l'utilisation élevée du processeur.

Merci!

EDIT (6 mai 2011) J'ai oublié de mentionner si ce comportement est pertinent pour Java SE 1.4.2.

Était-ce utile?

La solution

Les threads consomment des ressources telles que la mémoire. Un fil de blocage / déblocage entraîne un coût de rallongement une fois. Si un fil bloquant / débloque des dizaines de milliers de fois par seconde, cela peut gaspiller des quantités importantes de CPU.

Cependant, une fois qu'un fil est bloqué, peu importe combien de temps il est bloqué, il n'y a pas de coût continu.

Autres conseils

La réponse n'est pas si simple. Il peut y avoir des cas où les fils qui entrent dans l'état bloqué peuvent finir par provoquer l'utilisation du processeur.

La plupart des JVM utilisent des algorithmes de verrouillage à plusieurs niveaux. Les algorithmes impliquent souvent des algorithmes tels que des spinlocks, en particulier pour les verrous tenus pendant une courte durée. Lorsqu'un thread essaie d'acquérir un moniteur et le constate, le JVM peut réellement le mettre dans une boucle et faire tenter le thread d'acquérir le moniteur, plutôt que le contexte qui le change immédiatement. Si le thread ne parvient pas à acquérir le verrouillage après un certain nombre d'essais ou de durée (en fonction de l'implémentation JVM spécifique), le JVM passe à un mode "verrouillage de graisse" ou "verrouillage gonflé" où il fait passer le contexte.

C'est avec le comportement Spinlock où vous pouvez entraîner des coûts de processeur. Si vous avez du code qui contient un verrouillage pendant une très courte durée et que l'affirmation est élevée, vous pouvez voir une bosse appréciable dans l'utilisation du processeur. Pour certaines discussions sur diverses techniques, les JVM utilisent pour réduire les coûts sur les affirmations, voir http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.

Non, les fils qui sont bloqués sur un moniteur ne pas Prenez du temps de processeur supplémentaire.

Un thread suspendu ou bloqué ne consomme pas de temps de processeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top