Я надеюсь, что этой информации будет достаточно, так что приступим. Если вам нужна дополнительная информация, дайте мне знать в комментариях.
У меня есть класс с двумя внутренними классами. У каждого внутреннего класса есть два метода, которые вызывают метод во внешнем классе. Итак, это выглядит так:
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();
}
}
}
Важно отметить, что:
FirstInnerClass
и SecondInnerClass
передаются в WebView как интерфейс JavaScript, поэтому someMethod
и someOtherMethod
могут быть вызваны в любое время, в произвольном порядке. outerMethod
вызывается практически одновременно (я распечатываю сообщение журнала, и они имеют отметку времени 1000-я секунда) разными объектами. Затем мое приложение «выполняет что-то» дважды, потому что outerMethodHasBeenCalled
по-прежнему ложно при вызове outerMethod
. Это не нормально, и это именно то, что я пытаюсь предотвратить. Мое приложение должно «делать что-то» только один раз и только один раз: при первом вызове outerMethod
. OuterClass
, но будьте уверены, что это только один экземпляр OuterClass
. Важно, что мое приложение «выполняет какие-то функции» только при первом вызове outerMethod
(надеюсь, это уже очевидно). Все последующие вызовы практически игнорируются. Какой бы внутренний класс ни вызвал outerMethod
первым - не имеет значения.
Итак, уместно ли использовать ключевое слово synchronized в этом случае?