Java 6 API Frage. Ruft LockSupport.unpark(thread)
eine passiert vor Beziehung auf die Rückkehr von LockSupport.park
in den gerade entparkten Thread? Ich vermute stark die Antwort ist ja, aber der Javadoc scheint es nicht explizit zu erwähnen.Java LockSupport Speicherkonsistenz
Antwort
Ich habe den JDK-Code angeschaut und es sieht so aus, als ob LockSupport-Methoden normalerweise außerhalb von Synchronisationsblöcken aufgerufen werden. Ihre Annahme scheint also korrekt zu sein.
Wenn es nicht als solches dokumentiert ist, dann können Sie sich NICHT darauf verlassen, dass es eine Situation vor der Beziehung erzeugt.
Speziell LockSupport.java im Hotspot-Code ruft einfach Unsafe.park und .unpark!
Die passiert vor Beziehung wird in der Regel von einem Schreib-Lese-Paar auf einem flüchtigen Statusflag oder etwas Ähnliches kommen.
Denken Sie daran, wenn es nicht als Schaffung eines passiert-vor Beziehung Sie müssen dann dokumentiert es behandeln, als ob es auch dann nicht, wenn Sie nachweisen können, dass es auf Ihrem spezifischen System der Fall ist. Zukünftige Systeme und Implementierungen möglicherweise nicht. Sie haben sich aus gutem Grund diese Freiheit gelassen.
Ich habe gerade diese Frage gefunden, weil ich mich das gleiche gefragt habe. Nach this article von Oracle Forscher David Dice, scheint die Antwort keine zu sein. Hier ist der relevante Teil des Artikels:
Wenn ein Thread in
park()
blockiert wir garantiert, dass eine nachfolgendeunpark()
wird es bereit machen. Eine vollkommen legale aber Implementierung vonpark()
undunpark()
wäre leere Methoden, in denen das Programm zum einfachen Spinnerei degeneriert. In der Tat ist das der Lackmustest für korrektepark()
-unpark()
Verwendung.
Leere park()
und unpark()
Methoden geben Sie keine passiert-vor Beziehung garantiert, so dass für das Programm 100% tragbar sein, sollten Sie nicht auf sie verlassen.
Dann wieder, die Javadoc of LockSupport sagt:
Diese Methoden als Werkzeuge verwendet werden sollen, die für die Erstellung geordnete Synchronisation Dienstprogramme und sind in sich nicht für die meisten Concurrency Control-Anwendungen nützlich. Die
park
Methode ist nur zur Verwendung in Konstruktionen der Form:
while (!canProceed()) { ... LockSupport.park(this); }
Da Sie müssen explizit ohnehin eine Bedingung überprüfen, die entweder volatile
oder richtig synchronisierten Variablen beinhalten wird, die schwachen Garantien park()
sollte eigentlich kein Problem sein, oder?
Danke für diese Antwort. Ich kann mich nicht erinnern, warum ich das wissen wollte. Ich vermute, ich frage mich, ob, wenn der laufende Thread die Bedingung aktualisiert und 'entparken' genannt hat, würde das, wenn dies selbst den nicht entparkt Thread garantieren würde, die aktualisierte Bedingung in einem konsistenten Zustand sehen. Es scheint, dass es keine Garantie gibt, also ist die einzige sichere Wahl, eine Speicherbarriere für die Zustandsaktualisierung explizit anzuordnen. – Lachlan
Ich verstehe. Wenn es eine * happen-before-Beziehung zwischen "park()" und "unpark()" gäbe, müsste die Bedingung keine Speicherbarriere beinhalten. Die Frage ist also immer noch gültig. – rolve
- 1. Java Thread - Speicherkonsistenz Fehler
- 2. Jedes praktische Beispiel von LockSupport & AbstractQueuedSynchronizer verwenden?
- 3. Java Memory Modell Frage
- 4. Java-Prozessabsturz - Java-Finalizer
- 5. fülle java Pane - JAVA
- 6. - JAVA
- 7. Android-java vs PC-Java
- 8. JAVA - LString Java, verknüpfte Strings
- 9. Java-Getter aktivieren Java-Getter
- 10. Unterschied zwischen Java und Java
- 11. Java-Streams in Java 7
- 12. die gleiche Geschwindigkeit wie Java von Java
- 13. Java SE eingebettet und Java ME
- 14. Messzeit in Java JNI (nativer Aufruf Java)
- 15. MongoDB Java - Abfrage auf mongodb Java-Treiber
- 16. Java zu XSD oder XSD zu Java
- 17. Richtig: Java "Enterprise" Edition = Java "Internet" Edition?
- 18. java -javaagent: Druck Befehl java Verwendung Richtlinien
- 19. Java: Methoden wie ord PHP in Java
- 20. wie SAML sso mit Java, Java EE
- 21. Datei .java aus einem Java-Programm kompilieren?
- 22. Java-Funktionen in Java serialisieren 8
- 23. Kompilieren von externen .java-Dateien aus Java
- 24. Rahmen Java-Systemeigenschaften auf eine Java-Anwendung
- 25. Java-Code Ausführen von innen Java
- 26. Java Klassenname, der mit Java beginnt
- 27. Java-Programm mit Java beenden Ergebnis: 137
- 28. Java: Java-Quellcode analysieren, Methoden extrahieren
- 29. Convert Java Servlet in Standalone-Java-Anwendung
- 30. Java instanziiert Short-Objekt in Java
Es tut uns leid, eine so alte Antwort kommentieren zu müssen, aber da die Frage die Java * API * und nicht die * Implementierung von Sun/Oracle ist, ist die Analyse des JDK 'LockSupport' nicht 100% korrekt. Die JDK-Entwickler können Annahmen über ihre eigene Implementierung treffen, während eine portable Anwendung dies nicht tun sollte. Darüber hinaus gibt es Möglichkeiten, eine * happen-before * -Beziehung zu erreichen, die keine "synchronisierten" Blöcke enthält. – rolve
"... durch den JDK Code geschaut": Können Sie bitte eine hg URL für OpenJDK posten? – kevinarpe