【发布时间】:2014-12-23 21:28:42
【问题描述】:
在一个多线程的 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% 安全?
【问题讨论】:
-
你可能是对的,;-)
-
不应该有任何内置的 java/编译器糖/魔法来确保方法 #1 始终有效。你对情况的理解也符合我对情况的理解。
标签: java android weak-references