Spero che questa informazione sia sufficiente, quindi ecco qui. Se hai bisogno di maggiori informazioni, fammelo sapere nei commenti.Quando utilizzare sincronizzato in Java
Ho una classe che ha due classi interne. Le classi interne hanno due metodi che chiamano un metodo nella classe esterna. Così, sembra che questo:
public OuterClass {
private boolean outerMethodHasBeenCalled = false;
private void outerMethod() {
if(!outerMethodHasBeenCalled) {
// do stuff
}
outerMethodHasBeenCalled = true;
}
private FirstInnerClass {
public void someMethod() {
outerMethod();
}
}
private SecondInnerClass {
public void someOtherMethod() {
outerMethod();
}
}
}
E 'importante notare che:
- Questo è per un'applicazione Android. Le istanze di
FirstInnerClass
eSecondInnerClass
vengono passate a una WebView come interfaccia JavaScript, pertantosomeMethod
esomeOtherMethod
possono essere richiamate in qualsiasi momento, senza un ordine particolare. - Attualmente ho un problema con il codice esistente (senza la parola chiave sincronizzata) dove
outerMethod
viene chiamato più o meno alla stessa ora (stampo un messaggio di registro e sono timestampati al millesimo di secondo) oggetti diversi. La mia app quindi "fa le cose" due volte perchéouterMethodHasBeenCalled
è ancora falso quando è stato chiamatoouterMethod
. Questo non è ok, ed è esattamente quello che sto cercando di prevenire. La mia app dovrebbe "fare cose" una sola volta e una sola volta: la prima volta viene chiamatoouterMethod
. - Potrebbe sembrare che io abbia più istanze di
OuterClass
, ma ho la certezza che è solo un'istanza diOuterClass
.
È importante che la mia app "faccia cose" solo la prima volta che venga chiamato outerMethod
(spero che sia evidente ormai). Tutte le chiamate successive vengono essenzialmente ignorate. Qualunque classe interna chiami prima outerMethod
- non importa.
Quindi, è appropriato utilizzare la parola chiave sincronizzata in questo caso?
+1 per AtomicBoolean, imparato qualcosa di nuovo :) – quaylar