Я из .net фона (вообще без опыта Java), но вы можете попробовать какой-нибудь простой статический флаг, который проверяет в начале метода, работает ли его алгоритм. Тогда все, что вам нужно сделать, это убедиться, что все операции чтения / записи этого флага синхронизированы. Поэтому в начале проверьте флаг, если он не установлен, установите его, если он установлен, верните. Если он не установлен, запустите оставшуюся часть метода и после его завершения сбросьте его. Просто убедитесь, что код вставлен в try / finally и флаг iunsetting установлен в finally, чтобы он всегда сбрасывался в случае ошибки. Очень упрощенный, но может быть все, что вам нужно.
Редактировать: это, вероятно, работает лучше, чем синхронизация метода. Потому что вам действительно нужен новый перевод сразу после того, как он закончится? И, возможно, вы не захотите слишком долго блокировать поток, если ему придется подождать некоторое время.