Java thread dump: Différence entre les “en attente de verrouillage” et “parking à attendre”?
Dans une Java thread dump, vous pouvez voir les verrous mentionné dans les traces de pile.
Il semble y avoir trois types de renseignements:
1:
- locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream)
2:
- waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl)
3:
- parking to wait for <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack)
- 1: Le fil a obtenu un verrou sur l'objet 0x00002aab329f7fa0.
- 2&3: l'air de dire que le thread est en attente d'un verrou sur l'objet de devenir disponible...
mais quelle est la différence 2 et 3?
- Je demande parce que je suis en train de corriger cette prometteuse open source verrouille l'outil de visualisation: gist.github.com/3039126
Vous devez vous connecter pour publier un commentaire.
Vous aurez "en attente de verrouillage" dans le thread dump lors de l'utilisation intrinsèque de serrures et de "parking à attendre" lors de l'utilisation de verrous à partir de java.util.de façon concomitante. Considérons l'exemple suivant:
Avec
lockTest.intrinsicLock()
vous obtenez les éléments suivants thread dump:tout
lockTest.reentrantLock()
produire:À mon avis, la java.util.simultanées package utilise presque LockSupport.park() méthode pour bloquer le thread, comme CountDownLatch, ReentrantLock qui appartiennent à abstractqueuedsynchronized cadre.
Ainsi, le 3ème scénario dans vos questions signifie que votre code appelle enfin LockSupport.park() la méthode, pour vous, l'utilisation simultanée de classe en java.util.simultanées paquet, le 2e scénario signifie que vous utilisez synchronisé clétage et l'appel en attente() la méthode explicite.