Xin chào bên dưới là đoạn trích từ Effective Java 2nd Edition. Ở đây tác giả tuyên bố đoạn mã sau đây nhanh hơn 25% so với trong đó u không sử dụng biến kết quả. Theo sách "Biến này là gì để đảm bảo rằng trường chỉ đọc một lần trong trường hợp phổ biến khi nó được khởi tạo." . Tôi không thể hiểu tại sao mã này sẽ nhanh sau khi giá trị được khởi tạo so với nếu chúng tôi không sử dụng kết quả Biến cục bộ. Trong cả hai trường hợp, bạn sẽ chỉ đọc một biến động sau khi khởi tạo cho dù bạn sử dụng kết quả biến cục bộ hay không.Tại sao đôi khi kiểm tra khóa là nhanh hơn 25% trong ví dụ Java hiệu quả Joshua Bloch
// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
Uhm, đây có phải là ấn bản đầu tiên không? Khóa đã kiểm tra đôi đã bị nản chí trong một số năm nay là – fge
Và lý do là: http://stackoverflow.com/questions/4926681/why-is-double-checked-locking-broken-in-java?rq=1 – Lenymm
@fge : Không hẳn. Kể từ Java 5, nó thực sự là một mẫu OK: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –