Birden fazla işlem i++
içerdiğinden, bu tür bileşik işlemlerin iş parçacığı için güvenli olmadığını biliyorum .
Ancak referansın kendisiyle kontrol edilmesi güvenli bir işlem midir?
a != a //is this thread-safe
Bunu programlamaya ve birden çok iş parçacığı kullanmaya çalıştım ama başarısız olmadı. Sanırım makinemde yarışı simüle edemedim.
DÜZENLE:
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();
}
}
Bu, iplik güvenliğini test etmek için kullandığım program.
Tuhaf davranış
Programım bazı yinelemeler arasında başladığında, çıkış bayrağı değerini alıyorum, bu da referans !=
kontrolünün aynı referansta başarısız olduğu anlamına geliyor . ANCAK bazı tekrarlamalardan sonra çıktı sabit değer haline gelir false
ve daha sonra programı uzun süre yürütmek tek bir true
çıktı üretmez .
Çıktının bazı n (sabit olmayan) yinelemelerden sonra önerdiği gibi, çıktı sabit bir değer gibi görünür ve değişmez.
Çıktı:
Bazı iterasyonlar için:
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
asla birbirinizi parçalamayın ). Bir yarış testi daha sıkı bir iç döngüye ihtiyaç duyar. Sonunda bir özet yazdırın (birisinin aşağıda birim test çerçevesiyle yaptığı gibi).