Когда использовать synchronized в Java

Я надеюсь, что этой информации будет достаточно, так что приступим. Если вам нужна дополнительная информация, дайте мне знать в комментариях.

У меня есть класс с двумя внутренними классами. У каждого внутреннего класса есть два метода, которые вызывают метод во внешнем классе. Итак, это выглядит так:

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();
        }
    }
}

Важно отметить, что:

  • Это приложение для Android. Экземпляры FirstInnerClass и SecondInnerClass передаются в WebView как интерфейс JavaScript, поэтому someMethod и someOtherMethod могут быть вызваны в любое время, в произвольном порядке.
  • В настоящее время у меня проблема с существующим кодом (без ключевого слова synchronized), где outerMethod вызывается практически одновременно (я распечатываю сообщение журнала, и они имеют отметку времени 1000-я секунда) разными объектами. Затем мое приложение «выполняет что-то» дважды, потому что outerMethodHasBeenCalled по-прежнему ложно при вызове outerMethod . Это не нормально, и это именно то, что я пытаюсь предотвратить. Мое приложение должно «делать что-то» только один раз и только один раз: при первом вызове outerMethod .
  • Может показаться, что у меня есть несколько экземпляров OuterClass , но будьте уверены, что это только один экземпляр OuterClass .

Важно, что мое приложение «выполняет какие-то функции» только при первом вызове outerMethod (надеюсь, это уже очевидно). Все последующие вызовы практически игнорируются. Какой бы внутренний класс ни вызвал outerMethod первым - не имеет значения.

Итак, уместно ли использовать ключевое слово synchronized в этом случае?

10
задан user5243421 29 February 2012 в 07:01
поделиться