Sobes.tech
Senior

Tüm bean'ler singleton'dır. Aynı REST metoduna birçok istek gelir. Çoklu iş parçacığı güvenliği nasıl sağlanır? Spring varsayılan olarak bir şey garanti ediyor mu?

sobes.tech yapay zeka

AI'dan gelen yanıt

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

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

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

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

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

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

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

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