Java LockSupport Speicherkonsistenz
-
21-09-2019 - |
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.
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 garantiertunpark()
wird es bereit machen. Ein völlig legal, aber minderwertige Implementierung vonpark()
undunpark()
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 korrektepark()
-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.