Je sais que les opérations composées telles que i++
ne sont pas thread-safe car elles impliquent plusieurs opérations.
Mais la vérification de la référence avec elle-même est-elle une opération thread-safe?
a != a //is this thread-safe
J'ai essayé de programmer cela et d'utiliser plusieurs threads mais cela n'a pas échoué. Je suppose que je n'ai pas pu simuler la course sur ma machine.
ÉDITER:
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();
}
}
C'est le programme que j'utilise pour tester la sécurité des threads.
Comportement étrange
Lorsque mon programme démarre entre certaines itérations, j'obtiens la valeur de l'indicateur de sortie, ce qui signifie que la !=
vérification de référence échoue sur la même référence. MAIS après quelques itérations, la sortie devient une valeur constante false
et l'exécution du programme pendant une longue période ne génère pas une seule true
sortie.
Comme la sortie le suggère après quelques n itérations (non fixes), la sortie semble être une valeur constante et ne change pas.
Production:
Pour certaines itérations:
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
ne fracassent les uns des autres ). Un test de course nécessite une boucle intérieure plus serrée. Imprimez un résumé à la fin (comme quelqu'un l'a fait ci-dessous avec un cadre de test unitaire).