可以在两次后续调用 Wea​​kReference.get() 之间对对象进行垃圾回收吗?

Vit*_*ski 2 java android garbage-collection weak-references

我有时会在某些库 API 中以及某人的代码中看到此类代码:

class SomeClass {

    private WeakReference<SomeObject> objectWeakReference; // initialized elsewhere

    public boolean isObjectAttached() {
        return objectWeakReference.get() != null;
    }

    public SomeObject getObject() {
        return objectWeakReference.get();
    }

}
Run Code Online (Sandbox Code Playgroud)

public void checkAndGetWeakReference() {
    SomeClass someClass = new SomeClass();
    if (someClass.isObjectAttached()) {
        someClass.getObject().doSomethingDirectlyOnReturnedObject(); // can the returned reference be null here ?
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我总是担心是否会出现千载难逢的 NullPointerException,假设此时没有对底层对象的强引用。

我真的不知道垃圾收集器何时可以开始从内存中删除对象以及它与基本线程流有何关联。

如果有人可以阐明这个特定主题和/或提供有关该主题的一些信息,那就太好了。

PS 我个人只会获得一次参考并将其分配给强参考。问题的重点是获得一些证据来证明上面的代码是错误的。

Dur*_*dal 5

WeakReference(以及 SoftReference)的全部要点是,所引用的对象可以在不存在对该对象的强引用的任何时候进行 gc'd。

由于 isObjectAttached() 返回时不存在强引用,因此可以在实际执行 getObject() 之前对其进行垃圾收集。对于这个用例来说,整个 idom 都是错误的。

唯一安全的方法是首先获取引用(例如局部变量),然后检查它是否为空。在这种情况下,该对象将无法被垃圾回收,因为局部变量强引用。