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 Threads

Bedeutet 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.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage