Tôi biết rằng các hoạt động ghép như i++
không phải là luồng an toàn vì chúng liên quan đến nhiều hoạt động.
Nhưng là kiểm tra tham chiếu với chính nó một hoạt động an toàn chủ đề?
a != a //is this thread-safe
Tôi đã cố gắng lập trình điều này và sử dụng nhiều chủ đề nhưng không thành công. Tôi đoán tôi không thể mô phỏng cuộc đua trên máy của mình.
BIÊN TẬP:
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();
}
}
Đây là chương trình mà tôi đang sử dụng để kiểm tra độ an toàn của luồng.
Hành vi kỳ lạ
Khi chương trình của tôi bắt đầu giữa một số lần lặp, tôi nhận được giá trị cờ đầu ra, điều đó có nghĩa là !=
kiểm tra tham chiếu không thành công trên cùng một tham chiếu. NHƯNG sau một số lần lặp, đầu ra trở thành giá trị không đổi false
và sau đó thực thi chương trình trong một thời gian dài không tạo ra một true
đầu ra duy nhất .
Như đầu ra gợi ý sau một số lần lặp n (không cố định), đầu ra dường như là giá trị không đổi và không thay đổi.
Đầu ra:
Đối với một số lần lặp:
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
không bao giờ đập vỡ nhau ). Một bài kiểm tra cuộc đua cần một vòng lặp bên trong chặt chẽ hơn. In một bản tóm tắt ở cuối (như ai đó đã làm dưới đây với khung kiểm tra đơn vị).