Я знаю, что составные операции, например i++
, не являются потокобезопасными, поскольку включают в себя несколько операций.
Но является ли проверка ссылки на самой себе поточно-ориентированной операцией?
a != a //is this thread-safe
Я пытался запрограммировать это и использовать несколько потоков, но ничего не вышло. Думаю, я не мог смоделировать гонку на своей машине.
РЕДАКТИРОВАТЬ:
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