Tôi phải viết một bài kiểm tra đơn vị để kích thích một tình trạng đua để tôi có thể kiểm tra nếu tôi có thể khắc phục sự cố sau này. Vấn đề là điều kiện chủng tộc chỉ xảy ra rất hiếm khi, có thể vì máy tính của tôi chỉ có hai lõi.Cho biết tình trạng chạy đua trong Java
Mã này là một cái gì đó như sau:
class MyDateTime {
String getColonTime() {
// datetime is some kind of lazy caching variable declared somewhere(does not matter)
if (datetime == null) {
initDateTime(); //Uses lazy to initlialize variable, takes some time
}
// Colon time stores hh:mm as string
if (datetime.colonTime == null) {
StringBuilder sb = new StringBuilder();
//Now do some steps to build the hh:mm string
//...
//set colon time
datetime.colonTime = sb.toString();
}
return datetime.colonTime;
}
}
Giải thích: initDateTime gán một trường hợp mới để datetime, do, datetime.colonTime là null sau đó (như chúng ta muốn khởi tạo nó lười biếng, như tôi đã nói trước). Bây giờ nếu Thread A đi vào phương thức và sau đó Scheduler dừng nó ngay trước khi nó có thể chạy initDateTime(). Chủ đề B bây giờ runst getColonTime(), thấy rằng datetime vẫn là null và khởi tạo nó. datetime.colonTime là null vì vậy nếu khối thứ hai được thực hiện và datetime.colonTime nhận giá trị của StringBuilder. Nếu sau đó trình lên lịch dừng luồng giữa dòng này và câu lệnh return và tiếp tục lại luồng A, điều sau sẽ xảy ra: Khi A bị dừng ngay trước khi initDateTime được gọi, A bây giờ gọi initDateTime(), sẽ loại đặt lại đối tượng datetime, thiết lập datetime.colonTime thành null một lần nữa. Thread A sau đó sẽ nhập thứ hai nếu block, nhưng scheduler sẽ làm gián đoạn A trước datetime.colonTime = sb.toString(); được gọi là. Như một kết luận, dateTime.colonTime vẫn là null. Bây giờ trình lên lịch sẽ tiếp tục B và phương thức trả về null.
Tôi cố gắng để chọc giận các điều kiện chủng tộc bằng việc có một số đề gọi getColonTime() cho một đơn (chính thức) thể hiện của MyDateTime, nhưng nó chỉ thất bại trong một số trường hợp hiếm extreeemly :( Bất kỳ gợi ý làm thế nào để viết một JUnit "test"?
Trước tiên, bạn có thể thử sử dụng trình gỡ lỗi để kích động tình trạng chủng tộc. I E. bắt đầu một thread, bắt nó trên một số breakpoint (như giữa if's) và bắt đầu một cái khác - và cứ thế. Sau khi bạn nhận được ý tưởng như thế nào RC xảy ra (có vẻ như bạn không có điều đó bây giờ) bạn có thể viết một bài kiểm tra đơn vị thành công – pupssman
Tôi không thấy làm thế nào bạn có thể nhận được 'trả về datetime.colonTime; 'và lấy lại null. Bạn có chắc chắn nó không phải là một vấn đề với cách bạn đang xây dựng chuỗi hh: mm? Có thể thêm mã đó vào câu hỏi của bạn để chúng tôi có thể xem xét điều đó. – Windle
Tôi đã thêm một số giải thích bổ sung tại sao nó có thể xảy ra. Phải thừa nhận nó không phải là rất rõ ràng – user3001