Wiem, że operacje złożone, takie jak, i++
nie są bezpieczne dla wątków, ponieważ obejmują wiele operacji.
Ale czy sprawdzanie referencji z samym sobą jest operacją bezpieczną dla wątków?
a != a //is this thread-safe
Próbowałem to zaprogramować i używać wielu wątków, ale to się nie udało. Chyba nie mogłem zasymulować wyścigu na mojej maszynie.
EDYTOWAĆ:
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();
}
}
To jest program, którego używam do testowania bezpieczeństwa wątków.
Dziwne zachowanie
Ponieważ mój program uruchamia się między niektórymi iteracjami, otrzymuję wartość flagi wyjściowej, co oznacza, że !=
sprawdzenie odniesienia nie powiedzie się w tym samym odwołaniu. ALE po kilku iteracjach wyjście staje się wartością stałą false
i wtedy wykonywanie programu przez długi czas nie generuje ani jednego true
wyjścia.
Jak sugeruje wynik, po kilku n (nie ustalonych) iteracjach, wyjście wydaje się mieć stałą wartość i nie zmienia się.
Wynik:
W przypadku niektórych iteracji:
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
nigdy rozbić siebie ). Test wyścigowy wymaga ciaśniejszej pętli wewnętrznej. Wydrukuj podsumowanie na końcu (jak ktoś zrobił poniżej z frameworkiem testów jednostkowych).