Hallo,
ich habe einige Quellen zu Concurrency gelesen und immer stellen sich mir einige Fragen wo ich mir nicht sicher bin ob die Antwort die ich habe korrekt ist. Vielleicht koennt ihr mir kurz helfen:
1. ich fuege einer leeren Liste ein Element hinzu. Danach aendere ich ein "volatile boolean EMPTY" von true auf false. Alle Threads sehen nun, dass EMPTY false ist. Sehen damit auch alle Threads das Element in der Liste und ist die Liste konsistent zu diesem Zeitpunkt? Wenn ja, wie funktioniert das genau - das Schreiben der volatilen variablen zwingt alle CPUs ihre Caches zu leeren und ALLES (also auch die Liste) nochmal neu aus dem Hauptspeicher zu holen?
Funktioniert das gleiche bei einem synchronized Block? Wenn ich diesen mit einem Thread betrete passiert was mit den CPU Caches? Und was ist wenn ich den Block verlasse - werden dann die Aenderungen die im Block stattgefunden haben in den Hauptspeicher geschrieben und alle anderen Threads invalidieren ihre Caches und holen sich diese Werte erneut aus dem Hauptspeicher?
2. ein komplexes volatiles Objekt hat eine Vielzahl vom Feldern die wiederum komplexe Objekte sein koennen. Wenn ich dieses komplexe Objekt veraendere (also z.B. einem Feld einen neuen Wert zuweise bzw. wenn das Feld eine Liste ist ein Objekt der Liste hinzufuege), sehen dann alle Threads diese Aenderung?
Oder verspricht die das volatile lediglich, dass alle Threads sofort sehen wenn die volatile variable auf ein neues komplexes Objekt zeigt (also eine neue Referenz) aber nicht wenn ich Interna des komplexen Objekts veraendere - dies sehen alle Threads nicht sofort bzw. haben unterschiedliche Daten bzgl. der Interna?
3. wenn ich ein komplexes Objekt in einem synchronized Block veraendere sind alle Aenderungen danach fuer alle Threads sichtbar. Wie laeuft die Synchronisierung ab - irgendwie kann ich mir schwer vorstellen woher die CPU weiss, was alles zu diesem komplexen Objekt gehoert. Selbst die JVM sollte ihre Probleme haben, ansonsten waere sowas wie Serialisierung einfacher? Oder werden einfach alle Caches komplett invalidiert und alle Daten erneut aus dem Hauptspeicher geholt nachdem ein Thread in einem synchronized Block etwas gemacht hat (selbst wenn der Block keine Daten veraendert hat)?
ich habe einige Quellen zu Concurrency gelesen und immer stellen sich mir einige Fragen wo ich mir nicht sicher bin ob die Antwort die ich habe korrekt ist. Vielleicht koennt ihr mir kurz helfen:
1. ich fuege einer leeren Liste ein Element hinzu. Danach aendere ich ein "volatile boolean EMPTY" von true auf false. Alle Threads sehen nun, dass EMPTY false ist. Sehen damit auch alle Threads das Element in der Liste und ist die Liste konsistent zu diesem Zeitpunkt? Wenn ja, wie funktioniert das genau - das Schreiben der volatilen variablen zwingt alle CPUs ihre Caches zu leeren und ALLES (also auch die Liste) nochmal neu aus dem Hauptspeicher zu holen?
Funktioniert das gleiche bei einem synchronized Block? Wenn ich diesen mit einem Thread betrete passiert was mit den CPU Caches? Und was ist wenn ich den Block verlasse - werden dann die Aenderungen die im Block stattgefunden haben in den Hauptspeicher geschrieben und alle anderen Threads invalidieren ihre Caches und holen sich diese Werte erneut aus dem Hauptspeicher?
2. ein komplexes volatiles Objekt hat eine Vielzahl vom Feldern die wiederum komplexe Objekte sein koennen. Wenn ich dieses komplexe Objekt veraendere (also z.B. einem Feld einen neuen Wert zuweise bzw. wenn das Feld eine Liste ist ein Objekt der Liste hinzufuege), sehen dann alle Threads diese Aenderung?
Oder verspricht die das volatile lediglich, dass alle Threads sofort sehen wenn die volatile variable auf ein neues komplexes Objekt zeigt (also eine neue Referenz) aber nicht wenn ich Interna des komplexen Objekts veraendere - dies sehen alle Threads nicht sofort bzw. haben unterschiedliche Daten bzgl. der Interna?
3. wenn ich ein komplexes Objekt in einem synchronized Block veraendere sind alle Aenderungen danach fuer alle Threads sichtbar. Wie laeuft die Synchronisierung ab - irgendwie kann ich mir schwer vorstellen woher die CPU weiss, was alles zu diesem komplexen Objekt gehoert. Selbst die JVM sollte ihre Probleme haben, ansonsten waere sowas wie Serialisierung einfacher? Oder werden einfach alle Caches komplett invalidiert und alle Daten erneut aus dem Hauptspeicher geholt nachdem ein Thread in einem synchronized Block etwas gemacht hat (selbst wenn der Block keine Daten veraendert hat)?
Zuletzt bearbeitet: