Ree
2012-02-19, 15:20:52
Hallo!
Tut mir leid für den komischen Titel, deshalb hier jetzt eine genauere Beschreibung:
Ich habe eine Klasse (Java), welche einen Vector kapselt. Die Klasse bietet Methoden an, um von außen Einträge in den Vector einfügen und auch wieder löschen zu können. Diese Methoden werden aus verschiedenen Threads heraus aufgerufen.
Das ist zwar nicht mein eigentliches Anliegen, aber hier die erste Frage: da der Vector per default thread-safe ist, muss ich die Methoden nicht auf multithreading auslegen (synchronzied etc), richtig?
Soweit, so gut. Worüber ich grüble:
Es gibt noch eine weitere Methode, die den Charakter von toString() besitzt. Diese nimmt den Vector, verarbeitet ihn in mehreren Schritten - sie extrahiert z.B. die letzten X Einträge aus dem Vector, wobei X (int) der Methode als Parameter übergeben wird. Das, was die Methode am Ende zurückgibt, ist ein formatierter String.
Ich bin mir nun unsicher, wie ich das ganze threadsafe gestalten kann.
Mit nur einem thread wäre es einfach:
public String getInfo(int x) {
int size = vector.size(); // danach noch prüfen, ob size >= x
for(int i = size; i > size-x; i--) {
// mit i-1 als index Daten aus Vector extrahieren und verarbeiten
stringbuilder.append(rechenergebnis);
}
return stringbuilder.tostring();
}
Bei mehreren Threads habe ich jetzt das Problem, dass z.B. "size" veraltet sein könnte, wenn die Schleife beginnt. Wenn der Vector gerade noch 16 Einträge hatte, dies in size abgespeichert wird, der Vector danach aber von einem anderen Thread geleert wird, dann krachts ja in der Schleife.
Jetzt will ich aber nicht um die komplette Verarbeitung ein synchronize machen, denn die Schleife läuft gut und gerne mal 5-10 Sekunden, dann würden in dieser Zeit ja alle fremden Zugriffsversuche blockiert werden.
Wie könnte ich das lösen?
kurz: Aus einem Vector sollen die letzten X Einträge ausgelesen werden, wobei andere Threads den Vector in der Zwischenzeit manipulieren können. Die ganze Operation zu synchronisieren wäre aber zu teuer, da die Schleife gerne mal 10 Sekunden läuft.
Vielen Dank!
Tut mir leid für den komischen Titel, deshalb hier jetzt eine genauere Beschreibung:
Ich habe eine Klasse (Java), welche einen Vector kapselt. Die Klasse bietet Methoden an, um von außen Einträge in den Vector einfügen und auch wieder löschen zu können. Diese Methoden werden aus verschiedenen Threads heraus aufgerufen.
Das ist zwar nicht mein eigentliches Anliegen, aber hier die erste Frage: da der Vector per default thread-safe ist, muss ich die Methoden nicht auf multithreading auslegen (synchronzied etc), richtig?
Soweit, so gut. Worüber ich grüble:
Es gibt noch eine weitere Methode, die den Charakter von toString() besitzt. Diese nimmt den Vector, verarbeitet ihn in mehreren Schritten - sie extrahiert z.B. die letzten X Einträge aus dem Vector, wobei X (int) der Methode als Parameter übergeben wird. Das, was die Methode am Ende zurückgibt, ist ein formatierter String.
Ich bin mir nun unsicher, wie ich das ganze threadsafe gestalten kann.
Mit nur einem thread wäre es einfach:
public String getInfo(int x) {
int size = vector.size(); // danach noch prüfen, ob size >= x
for(int i = size; i > size-x; i--) {
// mit i-1 als index Daten aus Vector extrahieren und verarbeiten
stringbuilder.append(rechenergebnis);
}
return stringbuilder.tostring();
}
Bei mehreren Threads habe ich jetzt das Problem, dass z.B. "size" veraltet sein könnte, wenn die Schleife beginnt. Wenn der Vector gerade noch 16 Einträge hatte, dies in size abgespeichert wird, der Vector danach aber von einem anderen Thread geleert wird, dann krachts ja in der Schleife.
Jetzt will ich aber nicht um die komplette Verarbeitung ein synchronize machen, denn die Schleife läuft gut und gerne mal 5-10 Sekunden, dann würden in dieser Zeit ja alle fremden Zugriffsversuche blockiert werden.
Wie könnte ich das lösen?
kurz: Aus einem Vector sollen die letzten X Einträge ausgelesen werden, wobei andere Threads den Vector in der Zwischenzeit manipulieren können. Die ganze Operation zu synchronisieren wäre aber zu teuer, da die Schleife gerne mal 10 Sekunden läuft.
Vielen Dank!