Frage

Java 6 API Frage. Hat Aufruf LockSupport.unpark(thread) hat eine passiert-vor Beziehung zur Rückkehr von LockSupport.park in dem gerade ausgeparkt Faden? Ich vermute stark, ist die Antwort ja, aber die Javadoc scheint nicht explizit zu erwähnen.

War es hilfreich?

Lösung

Ich habe allerdings den JDK-Code angesehen und es sieht aus wie LockSupport Methoden normalerweise außerhalb der Synchronisationsblöcke aufgerufen werden. So scheint Ihre Annahme richtig zu sein.

Andere Tipps

Ich habe gefunden, nur diese Frage, weil ich mir die gleiche Sache bitte. Nach diesem Artikel von Oracle Forscher David Dice , die Antwort nicht zu sein scheint. Hier ist der relevante Teil des Artikels:

  

Wenn ein Thread in park() blockiert sind wir, dass eine nachfolgende garantiert   unpark() wird es bereit machen. Ein völlig legal, aber minderwertige   Implementierung von park() und unpark() würde leere Methoden sein, in denen   das Programm degeneriert zu einfachen Spinnen. Ein in der Tat das ist die   Lackmus-Test für die korrekte park()-unpark() Nutzung.

Leere park() und unpark() Methoden, die Ihnen nicht gibt jedes passiert-vor Beziehung garantiert, so dass für das Programm 100% tragbar sein, sollten Sie nicht auf sie verlassen.

Dann wieder die Javadoc von LockSupport sagt:

  

Diese Methoden entwickelt als Werkzeuge verwendet werden für die Erstellung von   geordnete Synchronisation Dienstprogramme und sind an sich nicht   nützlich für die meisten Concurrency Control-Anwendungen. Die Methode ist park   Ausschließlich für die Verwendung in Konstruktionen der Form:

     

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

Da muss man explizit eine Bedingung überprüfen wie auch immer, die entweder volatile oder richtig synchronisierten Variablen beinhalten, sollten die schwachen Garantien von park() tatsächlich nicht Problem, nicht wahr?

Wenn es nicht als solche dokumentiert wird dann verlassen Sie können nicht auf sie die Schaffung eines vor Beziehung passiert.

Insbesondere LockSupport.java in Hotspot-Code ruft einfach Unsafe.park und .unpark!

Die passiert-vor Beziehung im Allgemeinen von einem Schreiblese Paar auf einem flüchtigen Status-Flag oder ähnliches kommen wird.

Denken Sie daran, wenn es nicht als Schaffung einer dokumentiert geschieht zuvor Beziehung, die Sie dann muss behandeln, als wäre es nicht, auch wenn Sie nachweisen können, dass es funktioniert auf Ihrem spezifisches System. Zukünftige Systeme und Implementierungen möglicherweise nicht. Sie ließen sich diese Freiheit aus gutem Grund.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top