In un progetto Android multithread, sto vedendo codice come questo:prova un riferimento debole prima di utilizzarlo java
final WeakReference<MyClass> myClassObjectWeakRef =
new WeakReference<MyClass>(aMyClassObject);
... poi qualche altra parte:
if (myClassObjectWeakRef.get() != null) {
myClassObjectWeakRef.get().someMethod();
}
Sono abbastanza certo c'è una possibile condizione di competizione tra il controllo e l'uso del riferimento, se l'ultimo riferimento forte all'oggetto viene rilasciato tra i due in un altro thread, ma non riesco a trovare alcuna documentazione o qualcuno che/chi può confermare questo meglio che con un "probabilmente hai ragione".
penserei l'unico modo giusto per testare & utilizzare un riferimento debole è fatto in questo modo:
MyClass myObject = myClassObjectWeakRef.get();
// we now have a strong reference, or null: standard checks apply.
if (myObject != null) {
myObject.someMethod();
}
Sono molto fiducioso che il secondo metodo è sicuro al 100%, ma mi chiedo se non v'è un po 'di Java/Compilatore zucchero/magia che non conosco, che renderebbe il primo metodo sicuro.
Quindi, il primo metodo è sicuro al 100% o no?
probabilmente hai ragione, ;-) – petey
Non ci dovrebbe essere alcun java/compiler sugar/magic integrato per garantire che il metodo # 1 funzioni sempre. La tua comprensione della situazione corrisponde anche alla mia comprensione della situazione. – NoseKnowsAll
Grazie per la domanda –