Hallo,
Ich habe ein Verständisproblem bzg. Synchronisierung und Concurrency:
Synchronisierung ist für eine Anwendung die darauf ausgelegt ist, die maximale Leistung durch das parallele Abarbeiten von Aufgabenzu erreichen, Gift.
Klar, an vielen Stellen kommt man wohl nicht drum rum... Aber ich habe jetzt einen speziellen Fall
und bin mir nicht sicher, ob ich synchronisieren muss oder nicht:
Meine Frage ist, ob es passieren kann, dass in der Funktion "public void addFutureListener(IoFutureListener<T> fl)" der Listener fl
nicht benachrichtigt wird, wenn ein anderer Thread parallel complete(null) aufruft.
Ich spreche quasi von dem Fall, dass in der Methode complete der Thread VOR "complete = true;" unterbrochen wird, dann die Methode addFutureListener wieder von einem anderem Thread abgearbeitet wird und dann bei listeners.offer(...) erneut unterbrochen wird.
Wenn nun also der Thread in der Methode complete(...) weiterarbeitet und z.b. dann erst wieder unterbrochen wird, wenn alle Listener benachrichtigt wurden, müsste ja eigentlich der Listener der DANN hinzugefügt wird, (z.b. wenn erst dann wieder der Thread der Methode addFutureListener weiterläuft) NICHT benachrichtigt werden oder ?
Ich meine, ist das sooo unwahrscheinlich, dass es vernachlässigt werden kann, oder mach ich grad nen denkfehler ?
Gruß,
Chris
Ich habe ein Verständisproblem bzg. Synchronisierung und Concurrency:
Synchronisierung ist für eine Anwendung die darauf ausgelegt ist, die maximale Leistung durch das parallele Abarbeiten von Aufgabenzu erreichen, Gift.
Klar, an vielen Stellen kommt man wohl nicht drum rum... Aber ich habe jetzt einen speziellen Fall
und bin mir nicht sicher, ob ich synchronisieren muss oder nicht:
Java:
package multiplex.future;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
*
* @author Christopher P.
*/
public class IoFuture<T> {
private final Queue<IoFutureListener<T>> listeners =
new ConcurrentLinkedQueue<IoFutureListener<T>>();
private volatile boolean complete = false;
private volatile Throwable throwable;
private volatile boolean success;
public void complete(Throwable throwable) {
if (isComplete()) {
return;
}
//No throwable means success
success = throwable != null ? true : false;
//Remember throwable
this.throwable = throwable;
//Now the future is complete
complete = true;
for (IoFutureListener<T> l : listeners) {
l.operationComplete(this);
}
//Now remove all listeners
listeners.clear();
}
public void addFutureListener(IoFutureListener<T> fl) {
if (!isComplete()) {
listeners.offer(fl);
System.out.println("auto");
} else {
fl.operationComplete(this);
System.out.println("manuell");
}
}
public void removeFutureListener(IoFutureListener<T> fl) {
listeners.remove(fl);
}
public boolean isComplete() {
return complete;
}
public boolean isSuccess() {
return success;
}
public Throwable getThrowable() {
return throwable;
}
}
Meine Frage ist, ob es passieren kann, dass in der Funktion "public void addFutureListener(IoFutureListener<T> fl)" der Listener fl
nicht benachrichtigt wird, wenn ein anderer Thread parallel complete(null) aufruft.
Ich spreche quasi von dem Fall, dass in der Methode complete der Thread VOR "complete = true;" unterbrochen wird, dann die Methode addFutureListener wieder von einem anderem Thread abgearbeitet wird und dann bei listeners.offer(...) erneut unterbrochen wird.
Wenn nun also der Thread in der Methode complete(...) weiterarbeitet und z.b. dann erst wieder unterbrochen wird, wenn alle Listener benachrichtigt wurden, müsste ja eigentlich der Listener der DANN hinzugefügt wird, (z.b. wenn erst dann wieder der Thread der Methode addFutureListener weiterläuft) NICHT benachrichtigt werden oder ?
Ich meine, ist das sooo unwahrscheinlich, dass es vernachlässigt werden kann, oder mach ich grad nen denkfehler ?
Gruß,
Chris