Все бины — синглтоны. В один и тот же REST-метод прилетает много запросов. Чем обеспечивается потокобезопасность? Spring что-то гарантирует из коробки?
Ответ от нейросети
sobes.tech AI
В Spring все бины по умолчанию синглтоны, то есть один экземпляр на весь контекст. REST-контроллеры тоже обычно синглтоны, и на них может одновременно приходить много запросов.
Потокобезопасность обеспечивается тем, что Spring не создает отдельный объект на каждый запрос, а использует один экземпляр, поэтому:
- Важно, чтобы поля контроллера были либо неизменяемыми (final), либо не содержали состояние, зависящее от конкретного запроса.
- Все данные, специфичные для запроса, должны храниться в локальных переменных методов, а не в полях класса.
Spring сам по себе не делает объекты потокобезопасными, он просто управляет жизненным циклом бинов. Потокобезопасность — ответственность разработчика.
Если нужно хранить состояние на уровне запроса, можно использовать scope @RequestScope или передавать данные через параметры методов.
Пример безопасного контроллера:
@RestController
public class MyController {
@GetMapping("/data")
public String getData() {
// локальные переменные — потокобезопасно
String result = compute();
return result;
}
}
Если же в контроллере есть изменяемые поля, они должны быть синхронизированы или заменены на потокобезопасные структуры.