Sobes.tech
Senior
61

Todos los beans son singletons. Se reciben muchas solicitudes en el mismo método REST. ¿Qué garantiza la seguridad de los hilos? ¿Spring garantiza algo por defecto?

Empresas donde se preguntó
Позитив Технолоджис

Respuesta de la IA

sobes.tech AI

В Spring все бины по умолчанию синглтоны, то есть один экземпляр на весь контекст. REST-контроллеры тоже обычно синглтоны, и на них может одновременно приходить много запросов.

Потокобезопасность обеспечивается тем, что Spring не создает отдельный объект на каждый запрос, а использует один экземпляр, поэтому:

  • Важно, чтобы поля контроллера были либо неизменяемыми (final), либо не содержали состояние, зависящее от конкретного запроса.
  • Все данные, специфичные для запроса, должны храниться в локальных переменных методов, а не в полях класса.

Spring сам по себе не делает объекты потокобезопасными, он просто управляет жизненным циклом бинов. Потокобезопасность — ответственность разработчика.

Если нужно хранить состояние на уровне запроса, можно использовать scope @RequestScope или передавать данные через параметры методов.

Пример безопасного контроллера:

@RestController
public class MyController {
    @GetMapping("/data")
    public String getData() {
        // локальные переменные — потокобезопасно
        String result = compute();
        return result;
    }
}

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