Wann wird java-thread-cache aktualisieren passiert?
Thread 1: ist die Ausführung dieser Schleife
while(running) {
//Do Task()
}
println("Done");
Thread mit 2 Sätzen ausgeführt false
Bei laufen ist eine volatile variable, thread1 kommt aus der Schleife heraus und druckt Sie auf "Fertig".
Meine Frage ist, wenn ausgeführt wird, nicht flüchtig, wenn nicht Thread1 liest läuft variable aus dem Hauptspeicher ?
Hinweis: Nun, ich weiß das passiert, bevor die Beziehung zur Synchronisation und volatile variable, aber der thread 1 nicht Stoppt, auch wenn ausgeführt wird, nicht flüchtig oder synchronisiert. Also meine Frage ist Wann kommt Thread 1 entscheidet, Lesen aus dem Hauptspeicher gegeben, dass KEINE SYNCHRONISATION oder KEINE FLÜCHTIGEN
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist beschrieben in der JLS unter dem Abschnitt Threads und Locks.
Wenn Sie den thread Lesen aus dem Arbeitsspeicher ist definiert in Bezug auf die Synchronisation Ordnung und geschieht, bevor Sie bestellen. Im Grunde es sagt, dass, um für eine Lesen ergeben den Wert, der zuletzt geschrieben, der schreiben muss passieren-vor das zu Lesen.
Das passiert-vor relation ist grob definiert in Bezug auf sperren/entsperren Aktionen und (mit wenigen Ausnahmen) darauf an, die Nutzung von synchronized Methoden und-Blöcke. Es sei denn, Sie beschäftigen sich mit der volatile-Variablen, die bottom-line ist in der Regel, dass Sie brauchen, um synchronisieren Sie alle Zugriff auf gemeinsame Daten, vorzugsweise durch
AtomicBoolean
eineBlockingQueue
oder anderen java.util.Auger-Klasse.Update: Wenn nicht passiert-vor relation besteht, der thread ist nie erforderlich, um "refresh cache". Diese Frage und es angenommen wird, ist die Antwort liefert ein konkretes Beispiel dafür.
Hier ist eine leicht modifizierte version der akzeptierten Antwort:
Warum nicht versuchen, es selbst?
Es ist keineswegs ein perfekter test, aber es gibt Ihnen eine grobe Schätzung. Auf meinem Rechner war der Unterschied ca 25ms. Natürlich hat es ausgeführt, die
System.out.println
zu, aber das sicherlich nicht so lange dauert.Ich weiß, das ist zu spät, um hinzufügen, um die gut erklärte Antwort. Aber ich hoffe, dass jemand bekommt Hilfe von meiner Antwort.Die Frage lautete, Wann wird java/jvm-Threads cache-refresh passiert?.
Gibt es keine Möglichkeit, die jvm wird flush oder aktualisieren Sie den lokalen thread-cache wenn Threads im Zustand runnable. Aber in Fällen wie beim thread ändern Sie seinen Zustand von selbst oder von externen thread-scheduler, dann auf jeden Fall den lokalen thread-cache-flush in den Hauptspeicher. Hier habe ich nur gezwickt das Beispiel aus der Antwort
Ich jetzt hier einfach die aktuellen in die wartenden thread. Diese Methode wird von vielen java-built-in-thread-Pools executor-wie üblich-thread-pool. So hier thread readfrom Arbeitsspeicher und beendet sich selbst.
Als thread1 bereits gelesen hat, ausgeführt, wird der zwischengespeicherte Wert und dieser bleibt für einige Zeit gültig. Dies ist wahrscheinlich die us oder ms sein könnte aber länger sein. Dies ist wahrscheinlich der Architektur abhängig und auch davon abhängen, wie voll die box ist.