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:
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.
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.
Gäbe es da eventuell eine bessere Lösung? oder sogar einen besseren Aufbau?
mfg
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: