Theo the source code, nó sử dụng lớp PhantomReference. Theo tài liệu:
Đối tượng tham chiếu Phantom được liệt kê sau khi người thu thập xác định rằng các tham chiếu của họ có thể bị thu hồi. Tài liệu tham khảo Phantom thường được sử dụng để lên lịch cho các hành động dọn dẹp trước khi xử lý một cách linh hoạt hơn khả năng với cơ chế hoàn thiện Java.
Nếu bộ thu gom rác xác định tại một thời điểm nhất định thì tham chiếu của tham chiếu ảo có thể truy cập được, sau đó tại thời điểm đó hoặc vào một thời gian sau nó sẽ đưa ra tham chiếu.
Để đảm bảo rằng đối tượng có thể khôi phục vẫn như vậy, tham chiếu của tham chiếu ảo có thể không được truy xuất: Phương thức get của tham chiếu ảo luôn trả về giá trị rỗng.
Không giống như tài liệu tham khảo mềm và yếu, tham chiếu ảo không tự động xóa bởi bộ thu gom rác khi chúng được đặt hàng. Một đối tượng có thể truy cập thông qua các tham chiếu ảo sẽ vẫn như vậy cho đến khi tất cả các tham chiếu như vậy bị xóa hoặc bản thân chúng trở nên không thể truy cập được.
Các constructor PhantomReference
chấp nhận hai đối số:
referent
- đối tượng tham chiếu phantom mới sẽ tham khảo
q
- hàng đợi mà tham chiếu là được đăng ký, hoặc null nếu không cần đăng ký
Đối số q
là một bản sao ance của lớp ReferenceQueue
. Các PhantomReference
sẽ được thêm vào này ReferenceQueue
khi nó là referent
trở thành ma có thể truy cập. Khi điều này xảy ra, bạn có thể truy xuất PhantomReference
bằng cách sử dụng các phương pháp poll()
hoặc remove()
của lớp ReferenceQueue
.
Ví dụ:
T objectToWatch = ...;
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>();
new PhantomReference<T>(objectToWatch, referenceQueue);
// Later on, probably in another thread...
Reference<? extends T> nextReference = referenceQueue.remove();
// Tidy up!
Lưu ý: PhantomReference
có các lớp anh chị em ruột có tên là SoftReference
và WeakReference
mà cũng có thể sử dụng. Mối quan hệ giữa các tài liệu này được ghi lại trong số java.lang.ref package documentation.
Nguồn
2009-08-04 13:37:00
Không sử dụng finalizers cho mục đích này, hoặc bất kỳ khác nếu bạn có thể tránh nó. Không có gì đảm bảo rằng phương thức finalize() sẽ được gọi ngay sau khi thu gom rác, hoặc thậm chí nó sẽ được gọi ở tất cả (Xem Hiệu quả Java 2nd Ed, Mục 7). Gói java.lang.ref là cách để đi. – Leigh
Nếu bạn có thể giúp, đừng sử dụng finalizers! http://stackoverflow.com/a/158791/74694 –