ฉันรู้ว่าการดำเนินการผสมเช่น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
1234:true
จะไม่มีการชนกัน ) การทดสอบการแข่งขันต้องใช้วงในที่เข้มงวดมากขึ้น พิมพ์บทสรุปในตอนท้าย (ตามที่มีคนทำด้านล่างด้วยกรอบการทดสอบหน่วย)