Synchronisation nicht statischer Methoden

Geminus

Mitglied
Hallo an alle

Ich habe ein Programm in dem Werte berechnet welche in eine Matrix geschrieben werden.
Nun will ich die Berechnungen für einzelne Zeilen auf unterschiedliche Threads aufteilen.

Dies löse ich im Moment so, dass jeder Thread auf dem gleichen Objekt die gleiche Berechnungsmethode aufruft, nur mit unterschiedlichen Parameter für die jeweilige Zeile.
Diese Methode ist nicht synchronized, es wird nur in einem synchronized Block ein jeweiliger Berechnungswert in die gemeinsam benutzte Matrix geschrieben. Das funktioniert an sich auch ohne Probleme. Ich hab nur allgemein die Fragen:

Kann ich bei einem solchen Vorgehen theoretisch Probleme bekommen? Oder dürfen in Java generell Threads beliebig Methoden aufrufen, insofern globale Variablen in synchronized Blöcken geschützt sind?
Bzw. ist die Variante die Berechnung auf unterschiedlichen Instanzen des Objekts vorzuziehen, weil dann jeder Thread seine "eigene" Methode in einem eigenen Objekt hat?
 
N

nillehammer

Gast
Kann ich bei einem solchen Vorgehen theoretisch Probleme bekommen? Oder dürfen in Java generell Threads beliebig Methoden aufrufen, insofern globale Variablen in synchronized Blöcken geschützt sind?
Du könntest Probleme bekommen, wenn die Matrix selbst veränderbar ist und zu ihr noch andere Zugriffsmöglichkeiten existieren als die synchronisierten Methoden. Außerdem müssen die Zugriffsmethoden alle auf den selben Mutex synchronisieren. Ansonsten ist das sicher.
Bzw. ist die Variante die Berechnung auf unterschiedlichen Instanzen des Objekts vorzuziehen, weil dann jeder Thread seine "eigene" Methode in einem eigenen Objekt hat?
Da fällt eine pauschale Antwort schwer. Das hängt stark vom Anwendungsfall ab. Es kann Sinn machen, mit Kopien zu arbeiten, um sich Synchronisationsarbeit zu ersparen. Es kann aber genauso sinnvoll sein, zu synchronisieren, um sich Kopierarbeit zu sparen...???:L
 

Geminus

Mitglied
Danke schon mal für die Antwort!

Du könntest Probleme bekommen, wenn die Matrix selbst veränderbar ist und zu ihr noch andere Zugriffsmöglichkeiten existieren als die synchronisierten Methoden. Außerdem müssen die Zugriffsmethoden alle auf den selben Mutex synchronisieren. Ansonsten ist das sicher.

Während die Methoden der Threads arbeiten wird nicht von wo anders auf die Matrix zugegriffen. Das sollte also gehen.
Was würde eigentlich passieren, wenn man den synchronized Block beim Schreiben in die Matrix weglassen würde?
Wenn man jeweils nur in unterschiedliche Zeilen der Matrix schreibt, müsste das rein theoretisch doch auch gehen. Man verändert ja nur Werte, die von keinem anderen Thread verändert werden. Oder sind da bei Java noch andere Sachen zu beachten?
 
N

nillehammer

Gast
Was würde eigentlich passieren, wenn man den synchronized Block beim Schreiben in die Matrix weglassen würde?
Das könnte zu "Dirty Reads" führen, wenn eine Leseopertion unterbrochen wird.
Wenn man jeweils nur in unterschiedliche Zeilen der Matrix schreibt, müsste das rein theoretisch doch auch gehen. Man verändert ja nur Werte, die von keinem anderen Thread verändert werden. Oder sind da bei Java noch andere Sachen zu beachten?
Wenn die Zeilen wirklich unabhängig sind, dann ja. Mit unabhängig meine ich aber nicht nur technisch unabhängig (keine Referenzen), sondern auch fachlich. Frage dich einfach, was muss auf jeden Fall in einem Rutsch (also ohne Unterbrechung) durchlaufen, damit am Ende wieder ein gültiger Zustand entscheht? Wenn Du zwei z.B. Zeilen vertauschst, hast Du folgende Aktionen, die entweder garnicht oder alle zusammen durchgeführt sein müssen, um vom einen gültigen Zustand in den anderen zu kommen:
- Lesen der ersten Zeile und Merken in einer Zwischenvariablen
- Lesen der zweiten Zeile und speichern in die erste
- Speichern der Zwischenvariablen in die zweite Zeile
War das einigermaßen verständlich erklärt????:L
 

Marco13

Top Contributor
Moment, moment, worum geht es? Wenn mehrere Threads in einen Array schreiben ist das kein Problem, solange sie das an unterschiedlichen Stellen tun. Und insbesondere braucht da auch nichts synchronized zu sein, im Gegenteil: Da macht man sich u.U. die Parallelität kaputt. (Speziell hier: Eine Matrix zeilenweise zu verarbeiten klingt SEHR "feingranular". Ggf. sollte man mehrere Zeilen zusammenfassen, also z.B. bei 400 Zeilen jeden Thread 100 Zeilen bearbeiten lassen (falls das geht)).

Was du mit "Globale Variablen" meinst, ist nicht ganz klar. Sowas wie
Java:
private static float value; // "Globale Variable"?

public static void compute(float input, float matrix[], int min, int max)
{

    value = input * 2; // <--- KNIRSCH!

    for (int i=min; i<max; i++) matrix = value;
}
würde ihn multithreaded und ohne synchronized natürlich raushauen. Solche statischen Methoden sollten rein funktional (d.h. abgesehen von den übergebenen Argumenten zustandsfrei) sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Synchronisation einer Textdatei im Groupshare Allgemeine Java-Themen 1
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
K Thread Synchronisation Allgemeine Java-Themen 8
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
F Bluetooth / Synchronisation : Problem mit einer Bluetoothanwendung Allgemeine Java-Themen 3
T Project Synchronisation Allgemeine Java-Themen 4
B Ausgabe auf der Konsole bei Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 8
B Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 10
R Konzept eines Software-Rollout/Synchronisation via WebService Allgemeine Java-Themen 5
H Thread Synchronisation. mutex.lock(); und mutex.unlock(); Allgemeine Java-Themen 4
S Synchronisation von Threads Allgemeine Java-Themen 7
T problem mit synchronisation Allgemeine Java-Themen 4
G Links zum Thema Synchronisation Allgemeine Java-Themen 7
H LRUMap und Synchronisation Allgemeine Java-Themen 5
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
S synchronisation einer Methode abhängig vom Parameter Allgemeine Java-Themen 10
S Threads und Synchronisation Allgemeine Java-Themen 3
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
C Synchronisation aber trotzdem parallel lesen Allgemeine Java-Themen 2
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
MiMa Vorhandenes das nicht existiert?? Allgemeine Java-Themen 7
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
D Twitch API mit HttpURLConnection läuft nicht? Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben