Memory-Effekte der Synchronisation in Java

JSR-133 FAQ sagt:

Synchronisation ist jedoch mehr als gegenseitiger Ausschluss. Durch die Synchronisierung wird sichergestellt, dass Speicherschreibvorgänge eines Threads vor oder während eines synchronisierten Blocks auf vorhersehbare Weise für andere Threads sichtbar gemacht werden, die auf demselben Monitor synchronisieren. Nachdem wir einen synchronisierten Block verlassen haben, geben wir den Monitor frei, wodurch der Cache in den Hauptspeicher geleert wird, sodass die von diesem Thread vorgenommenen Schreibvorgänge für andere Threads sichtbar sind. Bevor wir einen synchronisierten Block eingeben können, erfassen wir den Monitor, wodurch der Cache des lokalen Prozessors ungültig wird und die Variablen aus dem Hauptspeicher neu geladen werden. Wir werden dann in der Lage sein, alle Schriften zu sehen, die durch die vorherige Version sichtbar gemacht wurden.

Ich erinnere mich auch, dass ich gelesen habe, dass auf modernen Sun-VMs unkontrollierte Synchronisationen billig sind. Diese Behauptung verwirrt mich ein wenig. Betrachten Sie Code wie:

class Foo {
    int x = 1;
    int y = 1;
    ..
    synchronized (aLock) {
        x = x + 1;
    }
}

Aktualisierungen von x müssen synchronisiert werden. Löscht die Erfassung der Sperre den Wert von y auch aus dem Cache? Ich kann mir nicht vorstellen, dass dies der Fall ist, denn wenn dies der Fall wäre, könnten Techniken wie das Lock Striping nicht helfen. Kann die JVM alternativ den Code zuverlässig analysieren, um sicherzustellen, dass y nicht in einem anderen synchronisierten Block mit derselben Sperre geändert wird und daher den Wert von y nicht im Cache abgelegt wird, wenn der synchronisierte Block eingegeben wird?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage