Я знаю, что сложные операции, такие как i++
, не являются потокобезопасными, поскольку они связаны с несколькими операциями.
Но проверяет ли ссылка на себя безопасную по потоку операцию?
a != a //is this thread-safe
Я попытался запрограммировать это и использовать несколько потоков, но это не сработало. Думаю, я не мог имитировать гонку на своей машине.
EDIT:
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();
}
}
Это программа, которую я использую для проверки безопасности потоков.
Странное поведение
Когда моя программа запускается между некоторыми итерациями, я получаю значение выходного флага, а это означает, что проверка ссылки !=
не выполняется с той же ссылкой. НО после некоторых итераций выход становится постоянным значением false
, а затем выполнение программы в течение длительного времени не генерирует одиночный вывод true
.
Как видно из вывода после некоторых n (нефиксированных) итераций, результат кажется постоянным и не изменяется.
Вывод:
Для некоторых итераций:
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