Если вам нужно убедиться, что определенный блок кода выполняется только один раз за раз (будь то действие контроллера или что-то еще), вы можете использовать ключевое слово synchronized
в java.Вы можете добавить синхронизацию на уровне метода, добавив это к сигнатуре метода, хотя я не знаю, насколько хорошо это работает с действием контроллера (я никогда не пробовал).Вы также можете добавить синхронизированный блок, обернув код следующим образом:
// inside your controller action
synchronized {
// will only execute once concurrently within your JVM
}
Или вы можете синхронизировать некоторый объект, чтобы ваша синхронизация могла основываться на некотором параметре:
// inside your controller action
synchronized ("${params.something}-whatever".intern()) {
// will only execute one concurrently per unique 'key'
}
ТамСтоит ли изучать нюансы (например, что произойдет, если вы вызовете этот метод изнутри самого себя: он будет работать, и последствия для памяти интернирующих строк против использования некоторых других ключевых объектов для синхронизации), но это общий шаблон, который должен позволить вам контролироватьодновременное выполнение потенциально поточно-небезопасного кода.
Учитывая все вышесказанное, будьте осторожны при реализации такого шаблона.Довольно легко получить плохую производительность или даже тупики, когда зачастую основная проблема заключается в коде на стороне клиента и необходимости лучше обрабатывать дублированные или прерванные запросы!