Eu sei que operações compostas como i++
não são seguras para threads, pois envolvem várias operações.
Mas verificar a referência em si é uma operação segura para threads?
a != a //is this thread-safe
Tentei programar isso e usar vários threads, mas não falhou. Acho que não consegui simular a corrida na minha máquina.
EDITAR:
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();
}
}
Este é o programa que estou usando para testar a segurança de threads.
Comportamento estranho
Quando meu programa inicia entre algumas iterações, recebo o valor do sinalizador de saída, o que significa que a !=
verificação de referência falha na mesma referência. MAS, após algumas iterações, a saída se torna um valor constante false
e, em seguida, a execução do programa por um longo período de tempo não gera uma única true
saída.
Como a saída sugere após algumas iterações n (não fixas), a saída parece ser um valor constante e não muda.
Resultado:
Para algumas iterações:
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
não esmagar o outro ). Um teste de corrida precisa de um loop interno mais apertado. Imprima um resumo no final (como alguém fez abaixo com uma estrutura de teste de unidade).