Buffer-Vector einzeln und zusammen synchronisieren

mabuhay

Bekanntes Mitglied
Guten Abend

Ich habe eine Frage zur Synchronisation. Ich habe einen Vektor buffers mit mehreren Buffern (LinkedList). Auf diese Buffer wird jeweils aus unterschiedlichen Threads zugegriffen, darum muss ich die natürlich synchronisieren. Ich hab dies nun einfach jeweils so gemacht für das hinzufügen/lesen einzelner Werte aus einzelnen Buffern:

Java:
...

LinkedList<Number> list = buffers.get(bufferIndex);
			
synchronized (list) {
	return list.get(valuePos);
}

...

Somit ist jeweils sichergestellt, das aus einem der Buffer nicht gleichzeitig gelesen und geschrieben wird. (oder?)

Ich habe jetzt aber auch noch eine Methoden, welche alle der Buffer gleichzeitig bearbeitet, also ich kann mit der folgenden Methode zu jedem Buffer "aufs mal" einen Wert hinzufügen. Es gibt dann noch eine Methode getValues() welche aus allen Buffern den ersten wert ausliest.

Java:
public void addValues(Numbers...values) {
LinkedList<Number> list = null;

for (int i = 0; i < buffers.size(); i++) {
	list = buffers.get(i);

	synchronized (list) {
		list.offer(values[i]);
	}
	
}

Wenn ich nun in addValues() nur wie im ersten Codebeispiel jeweils den einen Buffer synchronisiere, könnte es ja sein dass ich gerade bei einem Buffer einen Wert hinzufüge, bei einem anderen aber ein Wert gelesen wird. Ich möchte also, dass ich in den addValues() und getValues() Methoden während dem hinzufügen oder lesen der Werte ALLE der Buffer blocken (synchronisieren) kann.
Möglich wäre es natürlich, wenn ich ein "dummy"-objekt habe auf welches ich zusätzlich noch synchronisiere, dann müsste ich aber um alle schon existierenden synchronized-blöcke noch einen zweiten darum legen.
Java:
Object o = new Object();

...

LinkedList<Number> list = buffers.get(bufferIndex);
synchronized(o) {	
	synchronized (list) {
		return list.get(valuePos);
	}
}

...

Gäbe es da eventuell eine bessere Lösung? oder sogar einen besseren Aufbau?

mfg
 
Zuletzt bearbeitet:

Marco13

Top Contributor
....könnte es ja sein dass ich gerade bei einem Buffer einen Wert hinzufüge, bei einem anderen aber ein Wert gelesen wird.

Sie mag rethorisch wirken, aber ich muss sie stellen: Ist das schlimm? Es entstehen ja keine (intern) inkonsitenten Zustände oder exceptions oder so - jeder Buffer für sich ist "sicher".

Als Alternative, wenn ALLE gelockt werden sollen, würde mir da auch nichts anderes Einfallen, als so ein gemeinsames "Lock"-Objekt (EDIT: Siehe unten) - aber wie der Name schon sagt, würde man da (und eigentlich auch schon beim 'synchronized(list)') auf die Mechanismen aus java.util.concurrent zurückgreifen, siehe Lock Objects (The Java™ Tutorials > Essential Classes > Concurrency) . Da könnte man vielleicht auch noch was trickreiches mit Read/WriteLocks machen, aber dazu müßte man den Anwendungsfall und die Anforderungen genauer kennen...


EDIT: Um das nochmal zu betonen: Dieses verschachtelte synchronized ist halt schon exponentiell häßlicher als ein eizelnes synchronized ;) Ist "buffers" einfach ein [c]Vector[/c], oder eine eigene Klasse?
 
Zuletzt bearbeitet:

mabuhay

Bekanntes Mitglied
Ja, buffers ist einfach ein Vektor

Ich habe mir vorgestellt es könnte Probleme geben wenn ich zum Beispiel 5 Buffer habe und jeweils einen Wert an einer Position auslese. Jetzt habe ich vielleicht aus den ersten drei Buffern die Werte ausgelesen, der Vierte Buffer wurde aber schon so verändert dass an eben dieser Position gar kein Wert mehr steht. Könnte ich alle Listen synchronisieren, würde das nicht passieren da während dem auslesen der 5 Buffer keiner der Buffer modifiziert werden kann.

Ich habe es nun mal so gelöst, dass wenn beim Auslesen eine Position nicht ausgelesen werden kann, einfach null zurückgegeben wird (anstatt das Array mit jeweils einem Wert von jedem Buffer), oder alternativ dass die Position welche nicht ausgelesen werden kann mit null besetzt wird.

Schon mal danke für deine Antwort. Falls meine Lösung nicht ausreichend ist werde ich mich mal mit dem Link befassen den du gepostet hast.

mfg
 
S

SlaterB

Gast
wenn die Listen/ Buffer so zusammenhängen, dann könntest du überlegen sie gar nicht rauszugeben,
schreibe ne Methode get(bufferIndex, index) in der Hauptverwaltungsklasse, alle Zugriffe über diese Methode,
dann hast du eine zentrale Stelle wo du jederzeit an der Synchronisation feilen kannst,
falls die Methode synchronized ist, ist das ganz sauber ein Ausschluss gegen anderen Zugriff auf die Verwaltung,

aber natürlich schlecht falls irgendwelche Listendurchläufe oder ähnlich kompliziertes auch nötig sind
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L buffer overflow Allgemeine Java-Themen 7
K AES, Buffer und Bytes Allgemeine Java-Themen 2
P Buffer - Consumer Producer - Threads synchronisieren Allgemeine Java-Themen 15
M Auf Einträge im Buffer warten Allgemeine Java-Themen 7
P Sound Buffer prüfen Allgemeine Java-Themen 12
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
N IOException: "Reading from an output buffer" ? Allgemeine Java-Themen 2
Icewind Buffer.... Allgemeine Java-Themen 7
D Buffer Overflow in Java möglich? Allgemeine Java-Themen 5
C Sound: Keine Line gefunden. Zu großer internal buffer? Allgemeine Java-Themen 3
A Vector Strings in Array splitten Allgemeine Java-Themen 6
G Fehler mit Vector Allgemeine Java-Themen 3
M String Array Vector komprimieren und verschicken Allgemeine Java-Themen 3
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U Vector aus Oberklasse spezialisieren Allgemeine Java-Themen 2
R Vector in JList Allgemeine Java-Themen 11
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
H Index Out of Bounds bei Vector Allgemeine Java-Themen 4
H Java Vector Frage Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
C Vector/Point-Problem Allgemeine Java-Themen 3
B Suchalgorithmus der Klasse Vector Allgemeine Java-Themen 5
X Vector Allgemeine Java-Themen 3
S 2D Vector speziell ausgeben. Allgemeine Java-Themen 2
S Vector in Vector gespeichert, wie greift man darauf zu? Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
R Vector.clear() oder neu initialisieren Allgemeine Java-Themen 3
S vector & strings Allgemeine Java-Themen 26
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
D Array oder Vector in Enum Deklarieren Allgemeine Java-Themen 3
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
G JComponent in Vector - wie klonen? Allgemeine Java-Themen 7
V Performancefrage int-Vector/Stack Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
S JList in Vector Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
MQue Vector<..> nicht verwenden Allgemeine Java-Themen 4
H Vector<Character> zu char[] castern Allgemeine Java-Themen 2
T Element aus Vector entfernen Allgemeine Java-Themen 4
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
M get Funktion von Vector Allgemeine Java-Themen 4
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
V NullPointerException bei Vector Allgemeine Java-Themen 2
E einfache Frage zu Vector Allgemeine Java-Themen 8
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
G Vector beim Initialisieren befüllen Allgemeine Java-Themen 4
G Vector addAll Allgemeine Java-Themen 5
B sorteiren von Datein nach Zeitstempel in einem Vector Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
MQue Vector Allgemeine Java-Themen 7
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
P Vector auf JTree Allgemeine Java-Themen 6
P dynamisches Array / Vector Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
T Vector und remove? Allgemeine Java-Themen 13
T Vector in JAVA ? Allgemeine Java-Themen 10
P Vector in vielen Klassen Allgemeine Java-Themen 21
MQue Vector implementieren Allgemeine Java-Themen 2
MQue Vector<State> Allgemeine Java-Themen 2
O hilfe bei Vector frage Allgemeine Java-Themen 6
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H java.util.Vector langsam ? Allgemeine Java-Themen 5
H Vector<T>[] vecs = new Vector<T>[10]; geht nicht Allgemeine Java-Themen 2
N Java API java.util.vector Allgemeine Java-Themen 3
G Vector erweitern Allgemeine Java-Themen 4
S Vector sortieren nach Objekt-Info? Allgemeine Java-Themen 9
A Probleme mit Vector Allgemeine Java-Themen 6
M Vergleich im geordeten Vector und Methodenaufruf Allgemeine Java-Themen 2
J Vector - Wert ersetzen Allgemeine Java-Themen 14
J Vector - Boolean Allgemeine Java-Themen 24
M Vector zu einem byte[] Allgemeine Java-Themen 5
J Vector<Shape> Speichern [gelöst] Allgemeine Java-Themen 11
Y Array mit ID in Vector Allgemeine Java-Themen 6
T Vector <-> double Allgemeine Java-Themen 4
T ArrayList bzw. Vector per set-Methode? Allgemeine Java-Themen 3
T ArrayList oder Vector als Parameter? Allgemeine Java-Themen 7
M Vector add() unchecked? Allgemeine Java-Themen 5
M Probleme und Zeitdruck: Kunden-DB (Vector) Allgemeine Java-Themen 13
T Vector Array Allgemeine Java-Themen 5
M Kunden-DB mit Vector Allgemeine Java-Themen 9
J Vector sortieren Allgemeine Java-Themen 3
M Vector - contain Allgemeine Java-Themen 13
C String und char[] / String[] und Vector Allgemeine Java-Themen 21
N Vector -> 2Diminsonaler Array Allgemeine Java-Themen 10
N Alledateien in einem Ordner in ein Vector speichern Allgemeine Java-Themen 19
K Object nach Vector konvertieren Allgemeine Java-Themen 3
Z ResultSet in Array oder Vector schreiben! Allgemeine Java-Themen 2
C vector von vector sortieren Allgemeine Java-Themen 4
D Vector in String Allgemeine Java-Themen 5
J Von Collection zu vector Allgemeine Java-Themen 5
D Vector in Datei schreiben Allgemeine Java-Themen 18
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
H Vector in ein File-Array umwandeln Allgemeine Java-Themen 2
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
MiMa mit Log4j einzeln Protokollieren Allgemeine Java-Themen 7
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben