0

Java中,在引用链等一些复杂情况下,如何判断引用可达性?

假设在下面的示例中,str是软件引用的引用sr,并且sr是弱引用的引用wr

String str = "abc";
SoftReference<Object> sr = new SoftReference<>(str);
WeakReference<Object> wr = new WeakReference<>(sr);
str = null;
sr = null;

那么在这种情况下,什么是可达性str?根据Java doc:An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference.在这种情况下,str可以通过遍历wrandsr来访问,这意味着遍历会通过软引用。我可以说str是轻而易举的吗?但是在本文档中的参考对象链部分之后,似乎很难达到。str

4

1 回答 1

1

对于软可访问的引用,软引用本身必须是强可访问的或软可访问的。

您可以将这些引用视为一条链:一端是一个锚点(垃圾收集根:例如活动线程或类字段中的引用)。另一端是你的对象。

整个链条不能比中间的任何元素更强大,因为一旦任何元素断裂,整个链条就会断裂,而在那一刻你失去了对对象的访问。

垃圾收集器在清除引用之前清除弱引用,因此弱引用软引用更弱。

这意味着您的示例:一旦垃圾收集器清除对对象的弱引用,SoftReference您的对象/字符串就无法访问并且将被垃圾收集,即使垃圾收集器尚未清除软引用对象。

于 2021-03-22T18:47:06.860 回答