在一个多线程的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%安全的吗?