当前位置: 首页 > 面试题库 >

在使用Java之前先测试一个弱引用

屠杰
2023-03-14
问题内容

在一个多线程的Android项目中,我看到这样的代码:

final WeakReference<MyClass> myClassObjectWeakRef =
                new WeakReference<MyClass>(aMyClassObject);

…然后在其他地方:

if (myClassObjectWeakRef.get() != null) {
  myClassObjectWeakRef.get().someMethod();
}

我很确定,如果在另一个线程中在两者之间释放了对该对象的最后一个强引用,则在检查和引用的使用之间可能存在竞争状态,但是我找不到任何文档或任何/谁会比“您可能是对的”更好地确认这一点。

我认为测试和使用弱引用的唯一正确方法是这样完成的:

MyClass myObject = myClassObjectWeakRef.get();
// we now have a strong reference, or null: standard checks apply.
if (myObject != null) {
  myObject.someMethod();
}

我非常有信心第二种方法是100%安全的,但是我想知道是否存在一些我不知道的Java /编译器糖/魔术师,这会使第一种方法安全。

那么,第一种方法是否100%安全


问题答案:

第一种方法绝对是不安全的。每个呼叫get都是独立的。没有什么可以阻止GC在第一个之后get和第二个之前清除弱可到达的对象。

该javadoc的状态

假设垃圾收集器 在某个时间点
确定对象是弱可访问的。到那时,它将自动清除对该对象的所有弱引用,以及对所有其他弱可达对象的弱引用,这些对象都可以通过一系列强引用和软引用从该对象到达。

可以在任何时间点。调用get(),(有可能)将对对象的引用临时推入堆栈中,从而使该对象很容易达到(它在线程的堆栈上),但是当null完成比较时,可达性便消失了。在那一刻之后,GC可以确定该对象很难到达并清除其引用。然后,您会得到一个NullPointerException

使用第二种方法。但是请注意,通过将其分配给变量,可以使引用的对象高度可访问。



 类似资料:
  • 本文向大家介绍详解JAVA 弱引用,包括了详解JAVA 弱引用的使用技巧和注意事项,需要的朋友参考一下 定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型。在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收。 说明 弱引用,从名字来看就很弱嘛,这种引用指向的对象,一旦在GC时被扫描到,就逃脱不了被回收的命运。 但

  • 本文向大家介绍Lua教程之弱引用table,包括了Lua教程之弱引用table的使用技巧和注意事项,需要的朋友参考一下 这次要介绍的内容比较少,就一个——弱引用table 1.无法超越人类智慧的智能——自动内存管理的缺陷 我们都知道,Lua是具备自动内存管理的,好吧,也许有些朋友不知道。 我们只管创建对象,无须删除对象(当然,对于不要的对象你需要设置一下nil值),Lua会自动删除那些被认为是垃圾

  • 问题内容: 我目前正在尝试诊断应用程序中的缓慢内存泄漏。到目前为止,我掌握的事实如下。 我有4天运行该应用程序的堆转储。 该堆转储包含约800个WeakReference对象,这些对象指向保留40mb内存的对象(所有对象都是同一类型,出于这个问题的目的,我将其称为Foo)。 Eclipse内存分析工具显示,这些WeakReferences引用的每个Foo对象均未被其他任何对象引用。我的期望是,这应

  • 介绍 弱引用缓存。对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除。该类使用了WeakHashMap做为其实现,缓存的清理依赖于JVM的垃圾回收。 使用 与TimedCache使用方法一致: WeakCache<String, String> weakCache = CacheUtil.newWeakC

  • 我在静态处理程序中使用弱引用来避免内存泄漏,然而,有时这个引用会被取消,我不明白为什么。 静态处理程序在存储库类中定义,该存储库类有一个在后台执行操作的方法,接收回调以在操作完成时通知调用方: 处理程序的代码如下所示: 出于某种原因,有时是空的,我试图理解为什么。 活动代码如下所示: 正如您所见,我正在为回调创建一个匿名类,但没有人持有对它的引用。 这就是弱引用无效的原因吗? 谢谢。

  • 问题内容: 斯威夫特有: 强引用 参考文献薄弱 无人参考 无主引用与弱引用有何不同? 什么时候可以使用无主引用安全? 无主引用是否像C / C ++中的悬空指针一样具有安全风险? 问题答案: 双方并引用不创建一个被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。 但是为什么要两个关键词呢?这种区别与类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内