В многопоточном проекте 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% безопасен или нет?