Question

Java 6 Question API. Est-ce que l'appel LockSupport.unpark(thread) ont une arrive-avant relation avec le retour de LockSupport.park dans le fil juste autorisé à reprendre? Je soupçonne fortement la réponse est oui, mais le Javadoc ne semble pas mentionner explicitement.

Était-ce utile?

La solution

Je l'ai regardé si le code JDK et il semble que les méthodes LockSupport sont normalement appelés en dehors des blocs de synchronisation. Ainsi, votre hypothèse semble être correcte.

Autres conseils

Je viens de trouver cette question parce que je me posais la même chose. Selon cet article par le chercheur Oracle David Dice, la réponse semble être pas . Voici la partie pertinente de l'article:

  

Si un thread est bloqué dans park() nous garanti que la suite   unpark() il sera prêt. Une faible qualité parfaitement légal, mais   la mise en œuvre de park() et unpark() serait des méthodes vides, dans lequel   le programme dégénère à la filature simple. Un, en fait, c'est la   test décisif pour l'utilisation park()-unpark() correct.

Méthodes vides park() et unpark() ne vous donnent pas arrive-avant garanties de relations, donc pour que votre programme soit 100% portable, vous ne devriez pas compter sur eux.

Et puis, Javadoc rel="noreferrer"> dit:

  

Ces méthodes sont conçues pour être utilisées comme outils pour la création   utilitaires de synchronisation au niveau supérieur, et ne sont pas en eux-mêmes   utile pour la plupart des applications de contrôle d'accès concurrentiel. La méthode de park est   conçu pour être utilisé uniquement dans des constructions de la forme:

     

while (!canProceed()) { ... LockSupport.park(this); }

Puisque vous devez vérifier explicitement une condition de toute façon, qui soit impliquer volatile ou des variables correctement synchronisées, les faibles garanties de park() ne devraient pas réellement être un problème, non?

Si elle est pas documentée en tant que tel vous ne pouvez pas compter sur elle la création d'une relation arrive avant.

Plus précisément LockSupport.java dans le code Hotspot appelle simplement Unsafe.park et .unpark!

arrive-avant relation entre généralement d'une paire d'écriture-lecture sur un indicateur d'état volatil ou quelque chose de similaire.

Rappelez-vous, si elle n'est pas documenté comme la création d'un arrive-avant relation alors vous doit le traiter comme si elle ne même pas si vous pouvez prouver qu'il fait sur votre système spécifique. Les futurs systèmes et mises en œuvre ne peuvent pas. Ils se ont laissé cette liberté pour une bonne raison.

scroll top