Espero que esto sea suficiente información, así que aquí va. Si necesita más información, déjelo saber en los comentarios.Cuándo usar sincronizado en Java
Tengo una clase que tiene dos clases internas. Las clases internas tienen dos métodos que llaman a un método en la clase externa. Por lo tanto, se ve así:
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();
}
}
}
Es importante tener en cuenta que:
- Se trata de una aplicación para Android. Las instancias de
FirstInnerClass
ySecondInnerClass
se pasan a un WebView como una interfaz de JavaScript, por lo que se pueden llamar asomeMethod
ysomeOtherMethod
en cualquier momento, sin ningún orden en particular. - Actualmente tengo un problema con el código existente (sin la palabra clave sincronizada) donde
outerMethod
se llama más o menos al mismo tiempo (imprimo un mensaje de registro, y están marcados con el tiempo de milésimas de segundo) diferentes objetos Mi aplicación luego 'hace cosas' dos veces porqueouterMethodHasBeenCalled
sigue siendo falso cuando se llamó aouterMethod
. Esto no está bien, y es exactamente lo que intento evitar. Mi aplicación solo debe 'hacer cosas' una sola vez: la primera vez que se llama alouterMethod
. - Puede parecer que tengo varias instancias de
OuterClass
, pero tenga la seguridad de que es solo una instancia deOuterClass
.
Es importante que mi aplicación 'haga cosas' solo la primera vez que se llama outerMethod
(espero que ya sea evidente). Todas las llamadas siguientes son ignoradas. Cualquiera que sea la clase interna que llame primero a outerMethod
, no importa.
Entonces, ¿es apropiado usar la palabra clave sincronizada en este caso?
+1 para AtomicBoolean, aprendí algo nuevo :) – quaylar