Ich weiß, dass zusammengesetzte Operationen, wie sie i++
nicht threadsicher sind, mehrere Operationen beinhalten.
Aber ist das Überprüfen der Referenz mit sich selbst eine thread-sichere Operation?
a != a //is this thread-safe
Ich habe versucht, dies zu programmieren und mehrere Threads zu verwenden, aber es ist nicht fehlgeschlagen. Ich konnte wohl kein Rennen auf meiner Maschine simulieren.
BEARBEITEN:
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
instance.a = new Object();
}
}
});
testingReferenceThread.start();
updatingReferenceThread.start();
}
}
Dies ist das Programm, mit dem ich die Thread-Sicherheit teste.
Seltsames Verhalten
Wenn mein Programm zwischen einigen Iterationen startet, erhalte ich den Ausgabeflag-Wert, was bedeutet, dass die Referenzprüfung !=
für dieselbe Referenz fehlschlägt. ABER nach einigen Iterationen wird die Ausgabe zu einem konstanten Wert, false
und wenn das Programm dann über einen langen Zeitraum ausgeführt wird, wird keine einzige true
Ausgabe generiert .
Wie die Ausgabe nach einigen n (nicht festen) Iterationen andeutet, scheint die Ausgabe ein konstanter Wert zu sein und ändert sich nicht.
Ausgabe:
Für einige Iterationen:
1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true
1234:true
niemals gegenseitig zerschlagen ). Ein Renntest benötigt eine engere innere Schleife. Drucken Sie am Ende eine Zusammenfassung aus (wie unten bei einem Unit-Test-Framework).