Trong ArrayBlockingQueue
, tất cả các phương pháp yêu cầu khóa bản sao nó vào một biến địa phương final
trước khi gọi lock()
.Trong ArrayBlockingQueue, tại sao sao chép trường thành viên cuối cùng vào biến cuối cùng cục bộ?
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
final ReentrantLock lock = this.lock;
lock.lock();
try {
if (count == items.length)
return false;
else {
insert(e);
return true;
}
} finally {
lock.unlock();
}
}
Có lý do nào để sao chép this.lock
cho một biến địa phương lock
khi lĩnh vực this.lock
là final
?
Ngoài ra, nó còn sử dụng một bản sao cục bộ của E[]
trước khi hành động trên nó:
private E extract() {
final E[] items = this.items;
E x = items[takeIndex];
items[takeIndex] = null;
takeIndex = inc(takeIndex);
--count;
notFull.signal();
return x;
}
Có bất kỳ lý do để sao chép một lĩnh vực thức cho một biến thức địa phương?
mạnh nhấn mạnh về "cực đoan"! Đây không phải là một thực hành lập trình tốt mục đích chung mà tất cả mọi người nên được thi đua. –
Ngẫu nhiên FYI: trong một số trường hợp khác khi bạn thấy điều này được thực hiện, đó là vì trường được đề cập là dễ bay hơi và phương pháp cần đảm bảo rằng nó có giá trị nhất quán duy nhất hoặc tham chiếu cho nó trong suốt. –
Tôi sẽ thực hiện tối ưu hóa "cực đoan" này trong một lớp lõi như thế này. –