Проверьте слабую ссылку перед использованием Java
В многопоточном проекте 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% или нет?