В многопоточном проекта Android, я вижу такой код:Тест слабая ссылка перед использованием Java
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% безопасен или нет?
вы, вероятно, правы;;) – petey
Не должно быть встроенного сахара/магии компилятора/магии, чтобы гарантировать, что метод №1 всегда будет работать. Ваше понимание ситуации соответствует моему пониманию ситуации. – NoseKnowsAll
Спасибо за вопрос –