Junior — Middle
Y a-t-il un problème potentiel lors de l'utilisation de @RestController avec un compteur dans un Endpoint lorsque plusieurs clients envoient des requêtes simultanément?
sobes.tech IA
Réponse de l'IA
Да, может возникнуть проблема с состоянием счетчика при одновременных запросах от множества клиентов, если счетчик хранится как обычная переменная в контроллере.
@RestController в Spring по умолчанию является singleton, то есть один экземпляр на все запросы. Если счетчик — это поле класса, то при параллельном доступе без синхронизации возможны состояния гонки (race conditions), что приведет к некорректному подсчету.
Чтобы избежать этой проблемы, нужно использовать:
- Потокобезопасные типы данных, например, AtomicInteger.
- Синхронизацию доступа к счетчику (synchronized, ReentrantLock).
- Хранение состояния вне контроллера, например, в базе данных или кэше с поддержкой атомарных операций.
Пример с AtomicInteger:
@RestController
public class CounterController {
private AtomicInteger counter = new AtomicInteger(0);
@GetMapping("/count")
public int increment() {
return counter.incrementAndGet();
}
}