Tôi đang đọc "Java Concurrency trong thực tế" và xem mã ví dụ ở trang 51.Cách chứng minh điều kiện chủng tộc xung quanh các giá trị không được xuất bản đúng cách?
Theo sách, đoạn mã này có nguy cơ thất bại nếu nó chưa được xuất bản đúng cách. Bởi vì tôi thích viết mã ví dụ và phá vỡ chúng để chứng minh cách chúng hoạt động. Tôi đã cố gắng để làm cho nó ném một AssertionError nhưng đã thất bại. (Dẫn tôi đến số previous question)
Có thể ai đó đăng mã mẫu để một AssertionError được ném không? Quy tắc: Không sửa đổi lớp Chủ.
public class Holder{
private int n;
public Holder(int n){
this.n = n;
}
public void assertSanity(){
if (n != n) {
throw new AssertionError("This statement is false");
}
}
}
Tôi đã sửa đổi lớp để làm cho nó dễ vỡ hơn nhưng tôi vẫn không thể nhận được một AssertionError ném.
class Holder2 {
private int n;
private int n2;
public Holder2(int n) throws InterruptedException{
this.n = n;
Thread.sleep(200);
this.n2 = n;
}
public void assertSanity(){
if (n != n2) {
throw new AssertionError("This statement is false");
}
}
}
Có thể thực hiện một trong các lớp ở trên ném một AssertionError không? Hay chúng ta phải chấp nhận rằng đôi khi họ có thể làm như vậy và chúng ta không thể viết mã để chứng minh điều đó?
Tại sao có cả hai câu hỏi? Chúng giống nhau. http://stackoverflow.com/questions/2614066/java-concurrency-in-practice-sample-question – Instantsoup
tôi tin rằng câu trả lời là giống như gustafc đưa ra trong q khác của bạn - rằng bạn không xuất bản một tham chiếu đến đối tượng cho đến khi hàm tạo hoàn tất. – oedo
Trên một lưu ý phụ: 'AssertionError' được dự định sử dụng nội bộ bởi cấu trúc ngôn ngữ' assert' của Java .... Tôi sẽ không sử dụng nó trực tiếp. khẳng định cũng an toàn để sử dụng trong mã sản xuất, bởi vì các xác nhận bị vô hiệu hóa theo mặc định (bạn có thể bật chúng bằng công tắc dòng lệnh '-esa'). – Powerlord