Mehrere Threads greifen auf eine Klasse zu

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi!

Ich habe eine Klasse (nennen wir sie mal "Speicher") in welcher mehrere Objekte einer anderen Klasse mitsamt id in einer HashMap gespeichert und auch wieder rausgelöscht werden. Die Daten müssen nicht in der Reihenfolge gelöscht werden, wie sie gespeichert wurden. D. h. ich hab meinetwegen die ids

1
2
3
4
5
6
7

vergeben und lösche dann einige (1, 3, 6) raus, dass dann die ids

2
4
5
7

bestehen bleiben. Jetzt kommt wieder eine Klasse hinzu, mein Programm überprüft welche kleinstmögliche id (damit ich wenigstens ein wenig Ordnung hab ;) ) nicht vergeben ist, stellt fest dass es sich um die 1 handelt und speichert die Klasse mitsamt id in der Hashmap. Folglich sind dann das

1
2
4
5
7

die Vergebenen IDs. Soweit kein Problem. Nur greifen u.U. mehrere Threads auf das selbe Objekt der Klasse Speicher zu und wollen Daten hinzufügen => 1. Thread schaut nach, sieht dass die 3 frei ist, aber bevor er die 3 zuweisen kann, schaut der 2. Thread auch nach welche id frei ist und stellt natürlich auch die 3 fest. Das hat dann freilich zur Folge, dass das 1. Objekt in der Hashmap mit dem 2. gleich wieder überschrieben wird => nicht gut ...

Da ich damit noch überhaupt keine Erfahrung gemacht habe, hätte ich da mal zwei Fragen:

1. Läuft das wirklich so ab, wie ich mir das Denke oder mache ich mir ganz umsonst Gedanken?
2. Falls ja, wie kann ich das Problem umgehen?

Danke für die Antworten!
 

norman

Top Contributor
sollte es nicht schon ausreichen, die methode(n), in der du nach einem freinen platz suchst und die klasse in die tabelle einträgst, als synchronized zu deklarieren?
oder denk ich da nicht genügend um die ecke ???:L
 

The_S

Top Contributor
norman hat gesagt.:
sollte es nicht schon ausreichen, die methode(n), in der du nach einem freinen platz suchst und die klasse in die tabelle einträgst, als synchronized zu deklarieren?
oder denk ich da nicht genügend um die ecke ???:L

kA, hab wie gesagt noch nichts damit gemacht. Deswegen frag ich ja :)
 

norman

Top Contributor
wenn schon ein thread nach freien plätzen suchst, bevor ein anderer den gefunden freien wieder besetzt hat, sollte synchronized abhilfe schaffen. dann kann thread2 erst loslegen, wenn thread1 mit der synchronized methode fertig ist.
evtl ist es dann geschickter, die sucheFreienPlatz() und schreibDichDaRein() und keine ahnung was methoden aus einer weiteren aufzurufen, die dann eben synchronized als attribut hat.
 
B

bygones

Gast
wirst wohl nicht rumkommen dich in Concurrent Programming einzulesen.

Für den Anfang sollte die bekannten Java Online Bücher Infos über Threads / synchronized usw. reichen
 

The_S

Top Contributor
deathbyaclown hat gesagt.:
wirst wohl nicht rumkommen dich in Concurrent Programming einzulesen.

Für den Anfang sollte die bekannten Java Online Bücher Infos über Threads / synchronized usw. reichen

Also reicht ein simples "synchronized" nicht aus!?
 

byte

Top Contributor
Es gibt zu dem Thema halt zig Algorithmen oder Konzepte (Transaktionen, Semaphoren, ...). Aber ich denke mal, in Deinen Fällen müsste es ausreichend sein, wenn Du den Zugriff auf Deine Datenstruktur synchronisierst. Die meisten Konzepte gehen eher in Richtung verteilter Anwendungen.
 

The_S

Top Contributor
ok, danke für eure Antworten. Setze das jetzt erstmal synchronized und werde mich nebenbei dennoch mal in die Thematik einlesen.
 

Leroy42

Top Contributor
Es wird mit synchronized funktionieren. Du mußt hier allerdings sorgfältig vorgehen.

norman hat gesagt.:
wenn schon ein thread nach freien plätzen suchst, bevor ein anderer den gefunden freien wieder besetzt hat, sollte synchronized abhilfe schaffen. dann kann thread2 erst loslegen, wenn thread1 mit der synchronized methode fertig ist.
evtl ist es dann geschickter, die sucheFreienPlatz() und schreibDichDaRein() und keine ahnung was methoden aus einer weiteren aufzurufen, die dann eben synchronized als attribut hat.
Diese Beschreibung könnte mißverstanden werden. Wichtig und unverzichtbar ist,
daß es keine zwei unabhängige Methoden sucheFreienPlatz() und schreibDichDaRein(). Beides muß
in einem Aufwisch entweder in einer Methode oder in einem synchronized-Block, der beide
Methoden hintereinander aufruft, erledigt werden.

Edit: P.S. an Hobbit:
Wo hast du eigentlich dieses tolle Merkel-im-Blutrausch-Foto her ( :cool: )
Gibts da ne Quelle? Mich interessiert vor allem, von welchem Originalwort die Silben
"töten" herkommen.
 

The_S

Top Contributor
Nur zum Verständnis, was ist jetzt richtig?

Code:
public synchronized void suchFreienPlatz() {
...
}

public synchronized void schreibDichDaRein() {
    ...
    suchFreienPlatz()
    ...
}

oder

Code:
public synchronized void suchFreienPlatz() {
...
}

public void schreibDichDaRein() {
    ...
    suchFreienPlatz()
    ...
}

oder

Code:
public void suchFreienPlatz() {
...
}

public synchronized void schreibDichDaRein() {
    ...
    suchFreienPlatz()
    ...
}

oder

Code:
public synchronized void blup() {
    schreibDichDaRein()
}

public void suchFreienPlatz() {
...
}

public void schreibDichDaRein() {
    ...
    suchFreienPlatz()
    ...
}

oder doch was ganz anderes? Ihr verwirrt mich nämlich gerade ein wenig ... :bahnhof: :autsch: ???:L

[edit] Das Hängt bei uns an der Bürotür :lol: , kA wer das da hingehängt hat, muss gewesen sein, als ich Berufsschule oder Urlaub hatte. Hab dann einfach mal bei Google Bildersuche nach "Merkel töten" gesucht und *schwupps* schon wars da
 

Leroy42

Top Contributor
Leider keins deiner Varianten :(

Variante 1 (Vorzuziehen)
Code:
public synchronized void suchFreienPlatzUNDSchreibDichDaRein() {
}
Variante (nicht empfehlenswert)
Code:
public int suchFreienPlatz() {
}
public void schreibDichDaRein(int pos ) {
}
public void irgendwoGanzAnders() {
    ...
    synchronized([i]deineVariable[/i]) {
        int pos = sucheFreienPlatz();
        trödelEinBischenHerum();
        schreibDichDaRein(pos);
    }
    ...

}

Zwei synchronized Methoden bringen nichts, da nach Abarbeitung der suchen-Methode
der Block verlassen wird und bevor dann schließlich eine Eintragung erfolgt, es passieren
kann, daß die suchen-Methode erneut aufgerufen wird.

Aus demselben Grund ist auch die Variante 2 nur dann sicher, wenn die beiden
Methoden nur hintereinander innerhalb eines synchronized-Blocks aufgerufen werden.
 

The_S

Top Contributor
Leroy42 hat gesagt.:
Variante 1 (Vorzuziehen)
Code:
public synchronized void suchFreienPlatzUNDSchreibDichDaRein() {
}

Ist das dann nicht äquivalent zu meiner Methode

Code:
public void suchFreienPlatz() { 
... 
} 

public synchronized void schreibDichDaRein() { 
    ... 
    suchFreienPlatz() 
    ... 
}
 

Leroy42

Top Contributor
Da hast du Recht!

Einzige Ausnahme ist, daß sucheFreienPlatz noch von woanders aufgerufen werden könnte.
Wenn du allerdings keine andere Methode hast, die etwas einträgt, wird deine Version
aber auch funktionieren.
 

The_S

Top Contributor
nein, hab keine andere Methode die darauf zugreift. Hatte ich das doch richtig verstanden, schock mich net immer so ;). Hab scho angefangen an meinem Verstand zu zweifeln ...
 

tini

Bekanntes Mitglied
wenn niemand anderes drauf zugreift, kannste die Methode suchFreienPlatz() aber auch private machen, oder?
 

flanker

Aktives Mitglied
ich würde es so machen:

Code:
public synchronized void changePool(MyObject obj, boolean delete) {
  if (delete) {
    delete(obj);
    return;
  }
  obj.setId(getNewId());
  insert(obj);
}

private int getId() {
  //Darf ausser [i]changePool[/i] niemand verwenden!
}

private void insert(MyObject obj) {
  //Darf ausser [i]changePool[/i] niemand verwenden!
}

private void delete(MyObject obj) {
  //Darf ausser [i]changePool[/i] niemand verwenden!
}
 

The_S

Top Contributor
Meinste jetzt von der Verwendung von synchronized her (hab ich auch so), oder vom Aufbau der Methoden?
 

flanker

Aktives Mitglied
eigentlich beides, denn wärend du id suchst und einfügst darf Pool niht verändert werden, beim löschen genauso, wärend gelöscht wird, darf nicht mal id abgefragt werden, oder?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
G mehrere Threads verwalten? Allgemeine Java-Themen 14
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
berserkerdq2 Ist es schlechter Programmierstyle mehrere Panes aufeinander zu machen? Allgemeine Java-Themen 1
Tarrew OpenAPI Schnittstelle - Mehrere Kunden mit unterschiedlichen Zugriffsrechten Allgemeine Java-Themen 2
A Mehrere for-Schleifen Allgemeine Java-Themen 2
M Mehrere Sounds Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
L mehrere Methoden Allgemeine Java-Themen 19
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
T String mehrere Worte Allgemeine Java-Themen 2
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S libGDX mehrere Texturen zu Einer zusammenfassen Allgemeine Java-Themen 0
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
F AWT Mehrere Tastatureingaben verarbeiten Allgemeine Java-Themen 5
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
F Mehrere JTables' drucken Allgemeine Java-Themen 0
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
K GUI-Entwicklung - Dispose, enabling und mehrere Controller Allgemeine Java-Themen 1
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
S Mehrere Shapes "malen" Allgemeine Java-Themen 3
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
J Erste Schritte Mehrere Mauszeiger für Ping Pong Game Allgemeine Java-Themen 7
P Mehrere MP3s abspielen Allgemeine Java-Themen 3
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
R JTree - Mehrere Roots Allgemeine Java-Themen 6
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4
H Mehrere Anwendungen von Java kontrollieren lassen Allgemeine Java-Themen 10
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
B mehrere services in einem client Allgemeine Java-Themen 10
G Process - mehrere Commands?! Allgemeine Java-Themen 2
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
F 1 Key - mehrere Values Allgemeine Java-Themen 3
G JOGL mehrere GLCanvas erstellen Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
P Java3D mehrere Ebenen parallel zu yz-Ebene Allgemeine Java-Themen 9
R mehrere jar Dateien kompinieren Allgemeine Java-Themen 14
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
I Wie kann ich mehrere Mp3 Tags ausgeben? Allgemeine Java-Themen 6
I Mehrere MP3 Dateien einlesen? Allgemeine Java-Themen 3
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
N mehrere klassen extenden Allgemeine Java-Themen 33
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
Daniel_L Mehrere (XML-)Datei aus einer ZIP-Datei auslesen Allgemeine Java-Themen 4
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
K Applet dass auf mehrere Bibliotheken zugreift Allgemeine Java-Themen 13
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15
G mehrere url's in ein array (problem mit // ) Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben