"Xin chào lần nữa!"

"Bây giờ tôi sẽ kể cho bạn nghe về một điều tuyệt vời nữa: WeakReference ."

"Trông gần giống với SoftReference:"

Ví dụ
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"Một tài liệu tham khảo yếu có một tính năng đặc biệt."

"Nếu một đối tượng không có tham chiếu thông thường hoặc tham chiếu mềm, mà chỉ có tham chiếu yếu, thì đối tượng đó vẫn còn hoạt động, nhưng nó sẽ bị hủy ở lần thu gom rác tiếp theo."

"Bạn có thể nói lại lần nữa không? Sự khác biệt giữa các tài liệu tham khảo này là gì?"

"Một đối tượng chỉ được giữ lại khỏi cái chết bởi SoftReference có thể tồn tại bao nhiêu bộ sưu tập rác tùy thích và có thể sẽ bị hủy nếu không đủ bộ nhớ."

"Một đối tượng chỉ được giữ lại khỏi cái chết bởi một WeakReference sẽ không tồn tại trong lần thu gom rác tiếp theo. Nhưng cho đến khi điều đó xảy ra, bạn có thể lấy đối tượng bằng cách gọi phương thức get() trên WeakReference sau đó gọi các phương thức của nó hoặc làm điều gì đó khác với nó ."

"Nếu đối tượng được tham chiếu bởi cả SoftReference và WeakReference thì sao?"

"Đơn giản thôi. Nếu ít nhất một tham chiếu thông thường trỏ đến một đối tượng, nó được coi là còn sống. Nhân tiện, tham chiếu như vậy được gọi là StrongReference."

"Nếu không có tham chiếu thông thường nào trỏ đến một đối tượng, nhưng SoftReference thì có, thì nó có thể truy cập được một cách nhẹ nhàng."

"Nếu không có tham chiếu thông thường hoặc SoftReferences trỏ đến một đối tượng, nhưng WeakReference thì có, thì nó có thể truy cập yếu."

"Hãy suy nghĩ về điều đó. Một SoftReference bảo vệ đối tượng khỏi bị xóa và đảm bảo rằng đối tượng sẽ chỉ bị xóa nếu không đủ bộ nhớ. Một WeakReference giữ đối tượng cho đến lần thu gom rác tiếp theo. Một SoftReference cung cấp khả năng chống xóa tốt hơn."

"À. Tôi nghĩ là tôi hiểu rồi."

"Tuyệt, vậy thì tôi sẽ kể cho bạn nghe về một điều thú vị khác liên quan đến WeakReferences - WeakHashMap."

"Nghe có vẻ nghiêm trọng đấy!"

"Và sau đó là một số! Một WeakHashMap là một HashMap có khóa là các tham chiếu yếu (WeakReferences)."

"Tức là, bạn thêm các đối tượng vào một HashMap như vậy và làm việc với chúng. Công việc như bình thường."

"Miễn là các đối tượng mà bạn lưu trữ trong WeakHashMap có các tham chiếu thông thường (mạnh hoặc mềm) làm khóa, các đối tượng này sẽ tồn tại."

"Nhưng giả sử không còn tham chiếu nào đến các đối tượng này trong toàn bộ ứng dụng. Tất cả những gì giúp chúng không bị chết là một vài WeakReferences bên trong WeakHashMap. Sau lần thu gom rác tiếp theo, các đối tượng đó sẽ tự biến mất khỏi WeakHashMap. Như thể chúng chưa bao giờ ở đó."

"Tôi không chắc mình đã hiểu."

"Bạn lưu trữ các cặp đối tượng trong WeakHashMap: một khóa và một giá trị. Nhưng WeakHashMap không tham chiếu trực tiếp đến các khóa mà thông qua WeakReferences. Do đó, khi các đối tượng được sử dụng làm khóa trở nên yếu, chúng sẽ bị hủy ở lần tiếp theo bộ sưu tập rác. Và kết quả là giá trị của chúng cũng tự động bị xóa khỏi WeakHashMap."

"Thật thuận tiện khi sử dụng WeakHashMap để lưu trữ thông tin bổ sung về các đối tượng nhất định."

"Trước hết, việc truy cập thông tin rất dễ dàng nếu bạn sử dụng chính đối tượng đó làm chìa khóa."

"Thứ hai, nếu đối tượng bị hủy, nó sẽ biến mất khỏi HashMap cùng với tất cả dữ liệu liên quan."

"Ví dụ:

Ví dụ
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo (…));

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "Bên trong WeakHashMap, các khóa được lưu trữ dưới dạng WeakReferences."
  2. "Ngay khi đối tượng người dùng bị trình thu gom rác hủy, phương thức remove(user) được gọi ngầm bên trong WeakHashMap và mọi thông tin liên quan đến đối tượng người dùng sẽ tự động bị xóa khỏi WeakHashMap."

"Đây có vẻ là một công cụ mạnh mẽ. Tôi có thể sử dụng nó ở đâu?"

"Điều đó tùy thuộc vào hoàn cảnh. Giả sử bạn có một luồng trong chương trình theo dõi công việc của một số tác vụ, được biểu thị bằng các đối tượng và ghi thông tin về chúng vào nhật ký. Chuỗi này có thể lưu trữ các đối tượng được giám sát trong WeakHashMap. Ngay sau đó vì các đối tượng không cần thiết, trình thu gom rác sẽ xóa chúng và các tham chiếu đến chúng cũng tự động bị xóa khỏi WeakHashMap."

"Nghe thú vị đấy. Tôi đã cảm thấy như mình chưa viết bất kỳ chương trình Java nghiêm túc nào tận dụng các cơ chế mạnh mẽ như vậy. Nhưng tôi sẽ nỗ lực hướng tới điều đó. Cảm ơn Ellie rất nhiều vì một bài học thú vị như vậy."