Hallo Leute
Wie auch andere Sprachen kennt Java den ternären Operator (condition ? true : false). Grundsätzlich ist mir die Verwendung dieses Operators schon klar. Eben ist allerdings mit ein paar Kollegen eine Diskussion über diesen Operator entbrannt.
Das Problem hängt im Prinzip mit multithreading etc. zusammen.
gegeben sei der folgender code:
b = (a > 10) ? 1 : a ;
was alternativ ja auch als
if (a > 10) {
b = 1 ;
} else {
b = a ;
}
geschrieben werden kann. Erfolgt diese Zuweisung nun allerdings in einer Methode, die aus mehreren Threads aufgerufen werden kann und a ist ein Member, wäre es ja theoretisch möglich, dass zwischen dem Vergleich und der Zuweisung sich der Wert von a ändert.
(klar - dafür hat man synchronisierte Blöcke - ist aber nicht das Thema)
Streitpunkt bei unserer Diskussion war nun, ob sich die beiden Codeteile in einer multithreaded-Umgebung anders verhalten - sprich ob es im ersten Fall dazu kommen kann, dass sich zwischen Vergleich und Zuweisung der Wert von a ändern kann.
Ich habe jetzt einiges gesucht und lediglich herausgefunden, dass es definitif einen Unterschied macht, wenn ich mit volatile Variablen arbeite. Wenn ich es recht verstanden habe, sind Operationen auf volatile Variablen immer atomar, d.h. auch in multithreaded-Umgebungen würde das erste Statement NIE unterbrochen.
Ist das der einzige „echte“ Unterschied zwischen den beiden Konstrukten? Mir ist schon klar, dass es noch andere Unterschiede gibt da in manchen Fällen Operatoren erlaubt aber sonstige Konstrukte verboten sind (z.b. Variablenzuweisung gleichzeitig mit Deklaration), aber das meine ich hier nicht.
Grosse Zusatzpreisfrage: ich verwende den ternären Operator ausschließlich mit volatile-Variablen in einer multithreaded-Umgebung und im true-Zweig rufe ich eine Methode auf, die länger läuft:
a = (b > 10) ? f(b) : b ;
…
public static int f(int b) {
// lange dauernder code…
}
wenn ich das richtig sehe, störe ich damit ziemlich massiv den Scheduler beim arbeiten und meine schönen Threads kommen sich massiv in die Quere. Liege ich da richtig?
LG
Erwin