Sobes.tech
Назад к вопросам
Senior
7

Все бины — синглтоны. В один и тот же 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;
    }
}

Если же в контроллере есть изменяемые поля, они должны быть синхронизированы или заменены на потокобезопасные структуры.