Erste Schritte Java Collections ohne synchronized gleichzeitig modifizieren?

OpaK

Mitglied
Ich hätte kurz eine Frage:

Java:
LinkedList<Info> copy;
synchronized (dataLock) {
  copy = new LinkedList<>(data.values());
}
// ...

kann hier ab Zeile 5 ganz normal mit copy, also ohne Synchronisation, weitergearbeitet werden, also über Elemente von copy iteriert, gelöscht, hinzugefügt werden - oder wird in Zeile 3 lediglich eine View auf die Daten erstellt, und die gleichzeitige Modifikation muss scheitern bzw. ist UB?
 

KonradN

Super-Moderator
Mitarbeiter
oder wird in Zeile 3 lediglich eine View auf die Daten erstellt,
Einfach einmal der Weg, wie dies überprüft werden kann.

Zum einen die Dokumentation: Diese sagt aus, dass da eine List erzeugt wird, die dann die Element des Iterators enthält.
Zum anderen aber auch der Source: Den kann man sich natürlich direkt ansehen:

Java:
    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param  c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    @SuppressWarnings("this-escape")
    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

Du hast also in copy eine eigenständige LinkedList, die unabhängig von data ist (außer eben, dass die Elemente aus data.values() da hinzugefügt wurden). Die Bearbeitung von copy ist also unabhängig von ggf. anderen Threads, die data verändern (Und dafür brauchst Du damit keine Synchronisation mehr)
 

OpaK

Mitglied
Ok, also kann ich dann copy strukturell verändern... (solange die Elemente (Info s) selbst nicht geändert werden, bzw. immutable sind)

Ich war mir nicht ganz sicher, weil eine Anwendung während einer Modifikation innerhalb einer Schleife einfach anhielt. Aber vermutlich war etwas anderes dafür der Auslöser.

Toll, dass es dich noch gibt , Konrad!

Btw.
Zum einen die Dokumentation
In der Doku zu values() stand allerdings etwas von "nur View ..." (also keine flache Kopie), deshalb war ich etwas irritiert.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, also kann ich dann copy strukturell verändern... (solange die Elemente (Info s) selbst nicht geändert werden, bzw. immutable sind)
Ja genau - und Du hast die Grenzen ach richtig erkennt (Sprich: copy und data sind nach dem Lauf des Konstruktors zu 100% separat, aber die Referenzen verweisen auf die gleichen Instanzen, so dass bei möglichen Änderungen wieder auf Thread-Sicherheit geachtet werden müsste.
Ich war mir nicht ganz sicher, weil eine Anwendung während einer Modifikation innerhalb einer Schleife einfach anhielt. Aber vermutlich war etwas anderes dafür der Auslöser.
Das ist immer eine blöde Sache. Erklärt auch recht gut Deine Überprüfung, aber das wäre hier aus meiner Sicht auszuschliessen und es müsste einen anderen Auslöser haben.
In der Doku zu values() stand allerdings etwas von "nur View ..." (also keine flache Kopie), deshalb war ich etwas irritiert.
Ja, das ist immer ein Prunkt, der nicht gerade unkritisch ist. Spielt aber für Dich in Deinem Code erst einmal keine Rolle, da Du ja in einem Synchronized Block die Elemente einfach durchgehst - und damit ist es hier eigentlich unkritisch, was values() nun im Detail macht.
 

OpaK

Mitglied
Das ist immer eine blöde Sache. Erklärt auch recht gut Deine Überprüfung, aber das wäre hier aus meiner Sicht auszuschliessen und es müsste einen anderen Auslöser haben.

Danke. Ja, mein Anwendungsfall ist:

  • es wird in festen Intervallen eine copy von der data-HashMap gezogen und diese wird verändert,
  • diese copy wird anschließend in eine Datenbank geschrieben...
  • währenddessen kann sich aber die data-HashMap "von außerhalb" ändern...
  • wenn die Anwendung neu gestartet wird, zieht sie sich einmal alle Daten aus der Datenbank und baut die Map neu auf,

Man könnte also sagen, die Map sei Producer und die Copy sei Consumer (also ein Cache ...), oder?

Vermutlich ging aber beim Persistieren etwas schief, also beim Schreiben von copy in die DB (denke ich im Nachhinein.)

Btw. Wieso ist das Forum eigentlich so lange "off" gewesen?
 

KonradN

Super-Moderator
Mitarbeiter
Ich selbst kann hier jetzt nicht wirklich viel sagen, da die Details fehlen.

Die typischen Pattern, die ich bei Deinen Worten vor Augen habe ist dann teilweise eher etwas wie:
  • Producer / Consumer - hier wären dann Interfaces wie Supplier<T> oder Consumer<T> die eingesetzt werden. Das wäre dann etwas wie: Wenn die data HashMap angepasst wird, dann wird auch ein Consumer aufgerufen um die Änderung direkt aktiv weiter zu geben. Oder umgedreht wäre der Supplier hat, dass jemand aktiv schaut: Gibt es etwas Neues?
  • Wäre dann unter dem Strich eine Art Event System, das da dann entsteht. Es passiert etwas und in dem Zusammenhang wird dann auch direkt etwas getriggert. Das ist ggf. sinnvoll vor allem auf einer höheren Ebene. Das sind dann die Konzepte, die hakt beliebig ausgebaut und skaliert werden können (MessageQueues, Enterprise Event Bus, ... ) Also z.B. auch interessant zwischen Anwendungen / Services ...

Btw. Wieso ist das Forum eigentlich so lange "off" gewesen?
Da liegen uns bisher keine Informationen vor.
 

OpaK

Mitglied
Na ja, es ist kein echter Consumer... die Daten werden nur in festen Intervallen weggespeichert: das heißt, copy wird persistiert. Währenddessen dürfen zu copy nur keine neuen Daten hinzukommen oder die bestehenden copy-Daten geändert werden, was aber auch nicht der Fall ist. Die DB-Operation (und ein Vorbereitungsschritt) kann aufwändig (also langsam) sein, deshalb arbeite ich hierbei mit einer flachen Kopie.

Ich könnte das noch weiter ausführen, es hätte dann aber nicht mehr viel mit der Frage zu tun, denke ich.

Da liegen uns bisher keine Informationen vor.
Ok, dann wohl Glück im Unglück. ;) o_O :D Bei mir ließ sich die Forum-Seite einfach nicht öffnen... dachte erst, ihr hättet den Stecker gezogen.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, dann wohl Glück im Unglück. ;) o_O :D Bei mir ließ sich die Forum-Seite einfach nicht öffnen... dachte erst, ihr hättet den Stecker gezogen.
Also das Forum war einige Zeit nicht online ... und davor gab es auch schon fast täglich Ausfälle ... Nur eben haben wir vom Betreiber keine Informationen dazu bekommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java Collections Java Basics - Anfänger-Themen 58
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
K Telefonbuch Implementation mit Java Collections Java Basics - Anfänger-Themen 4
ff Java Collections Java Basics - Anfänger-Themen 4
G Java Collections Framework : id + 5 Werte , gibt es sowas Java Basics - Anfänger-Themen 4
Sam Tophy Einfache Möglichkeit PDF in Java (Swing) anzuzeigen? Java Basics - Anfänger-Themen 1
J PDF-Datei in Java anzeigen Java Basics - Anfänger-Themen 14
D Java 32Bit Java Basics - Anfänger-Themen 45
M Java Programm/Schnittstelle aus unter Ordner in übergeordnetes java programmein binden Java Basics - Anfänger-Themen 2
A Is not true check, in Java? Java Basics - Anfänger-Themen 23
divorcelawyerseo1 How to accurately calculate the number of days between two dates in Java? Java Basics - Anfänger-Themen 40
J Java.exe mit seltsamen Verhalten Java Basics - Anfänger-Themen 5
M HelloWorld.txt nach HelloWorld.java in Win11 funktioniert nicht Java Basics - Anfänger-Themen 4
Sniper1000 Java lässt sich auf älterem Win 7 nicht mehr installieren Java Basics - Anfänger-Themen 34
J Probleme mit drucken aus Java Java Basics - Anfänger-Themen 3
Gokul Java chart library suggestion for web application? Java Basics - Anfänger-Themen 2
D wie kann ich gcc aus einer .java datei heraus aufrufen? Java Basics - Anfänger-Themen 2
S Text Formatierung in Java Java Basics - Anfänger-Themen 2
B Erste Schritte yaml parsen in Java Java Basics - Anfänger-Themen 19
C Methoden Umlaute in Java Java Basics - Anfänger-Themen 18
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 45
W Methoden java map ersatz für c++map Java Basics - Anfänger-Themen 3
M Erste Schritte Java Primzahltester Java Basics - Anfänger-Themen 4
A csv Reader für Java? Java Basics - Anfänger-Themen 27
K Java - Enums Java Basics - Anfänger-Themen 30
tomzen Java Unterstützung für exel dateien installieren. Java Basics - Anfänger-Themen 2
Rookar java.lang.NoClassDefFoundError: org/json/JSONException Java Basics - Anfänger-Themen 2
Rookar Mit Button andere java öffnen Java Basics - Anfänger-Themen 4
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
I Backend in Java und Ansicht von Dateien in statische HTML Seiten? Java Basics - Anfänger-Themen 15
R Input/Output Verwendung des Euro-Zeichens in Java Java Basics - Anfänger-Themen 7
I Push Nachrichten von JAVA EE App an Mobile App Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
G Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
G Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben