Interpretation der "Programmreihenfolgenregel" in der Java-Parallelität
Die Regel für die Programmreihenfolge lautet "Jede Aktion in einem Thread findet statt - vor jeder Aktion in diesem Thread, die später in der Programmreihenfolge erfolgt".
1.Ich habe in einem anderen gelesenFaden dass einAktion ist
liest und schreibt in VariablenSperren und Entsperren von MonitorenStarten und Verbinden mit ThreadsBedeutet dies, dass Lese- und Schreibvorgänge in der angegebenen Reihenfolge geändert werden können, Lese- und Schreibvorgänge jedoch nicht in der angegebenen Reihenfolge mit den in der 2. oder 3. Zeile angegebenen Aktionen?
2.Was bedeutet "Programmreihenfolge"?
Eine Erklärung mit Beispielen wäre sehr hilfreich.
Zusätzliche verwandte Frage
Angenommen, ich habe den folgenden Code:
long tick = System.nanoTime(); //Line1: Note the time
//Block1: some code whose time I wish to measure goes here
long tock = System.nanoTime(); //Line2: Note the time
Erstens ist es eine einzelne Thread-Anwendung, um die Dinge einfach zu halten. Der Compiler bemerkt, dass er die Zeit zweimal überprüfen muss, und bemerkt auch einen Codeblock, der keine Abhängigkeit von umgebenden zeitnotierenden Zeilen hat, so dass er das Potenzial sieht, den Code neu zu organisieren, was dazu führen kann, dass Block1 nicht von den Zeitaufrufen umgeben wird während der tatsächlichen Ausführung (zum Beispiel beachten Sie diese Reihenfolge Line1-> Line2-> Block1). Aber ich als Programmierer kann die Abhängigkeit zwischen Line1,2 und Block1 erkennen. Zeile1 sollte sofort vor Block1 stehen, Block1 benötigt eine endliche Zeitspanne, und Zeile2 folgt sofort.
Meine Frage ist also: Vermesse ich den Block richtig?
Wenn ja, was hindert den Compiler daran, die Reihenfolge neu zu ordnen?Wenn nein, was kann ich tun, um dies zu verhindern?P .: Ich habe diesen Code gestohleneine andere Frage Ich habe vor kurzem in SO gefragt.