Saya tahu bahwa operasi gabungan seperti i++
tidak aman karena melibatkan beberapa operasi.
Tetapi apakah memeriksa referensi dengan sendirinya operasi yang aman?
a != a //is this thread-safe
Saya mencoba memprogram ini dan menggunakan beberapa utas tetapi tidak gagal. Saya kira saya tidak bisa mensimulasikan balapan di mesin saya.
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();
}
}
Ini adalah program yang saya gunakan untuk menguji keamanan thread.
Perilaku aneh
Ketika program saya mulai di antara beberapa iterasi saya mendapatkan nilai flag output, yang berarti bahwa !=
pemeriksaan referensi gagal pada referensi yang sama. TETAPI setelah beberapa iterasi output menjadi nilai konstan false
dan kemudian menjalankan program untuk waktu yang lama tidak menghasilkan true
output tunggal .
Seperti yang disarankan oleh output setelah beberapa iterasi n (tidak tetap), output tersebut tampaknya bernilai konstan dan tidak berubah.
Keluaran:
Untuk beberapa iterasi:
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
tidak pernah saling menghancurkan ). Tes perlombaan membutuhkan loop dalam yang lebih ketat. Cetak ringkasan di bagian akhir (seperti yang dilakukan seseorang di bawah ini dengan kerangka uji unit).