Блок synchronized
синхронизирует вызовы, которые используют тот же экземпляр . Поскольку каждый вызов вашей службы создает новый экземпляр SampleRequestBody
, синхронизация практически отсутствует.
Вы можете выполнить синхронизацию по свойству identifier
объекта запроса, храня строки в каком-то локальном кэше, чтобы снова получить тот же экземпляр строки для того же идентификатора:
// you should not actually use String.intern() here but some local cache
synchronized(sampleRequestBody.getIdentifier().intern()) {
//Do some process with the sample request body
}
Приведенный выше пример использует String.intern()
только для простоты. В реальном живом приложении следует избегать использования String.intern()
, поскольку оно создает объекты в памяти, которые не охватываются Java GC. То есть вместо этого используйте локальный кеш.
Кроме того, следует помнить, что эта синхронизация будет работать только для каждой JVM. То есть, если у вас есть два сервера с балансировкой нагрузки, это не будет работать должным образом.
И еще одна мысль: вам действительно следует переосмыслить необходимость синхронизации здесь. Используйте его, только если нет другой возможности решить ваши требования.