Sobes.tech
Senior
62

Tutti i bean sono singleton. Arrivano molte richieste allo stesso metodo REST. Come viene garantita la sicurezza dei thread? Spring garantisce qualcosa di default?

Le aziende dove è stato chiesto
Позитив Технолоджис

Risposta dell'AI

sobes.tech AI

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

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

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

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

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

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

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

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