В типичном контейнере используется модель потока на запрос, поэтому у вас встроена легко распознаваемая граница. Общее правило - никогда не сохранять состояние в каком-либо объекте, который виден нескольким запросам (потокам), если только государство эффективно неизменным. Например, одноэлементный контроллер, подобный этому
@Controller
@RequestMapping("/schedule")
class MyController {
private Scheduler scheduler;
@RequestMapping(method = RequestMethod.POST)
public void scheduleSomething(Foo foo) {
scheduler.schedule(foo);
}
}
является состоящим - поле расписания содержит состояние - но состояние инициализируется при запуске и остается постоянным во всех запросах / потоках. Если у вас был такой одноэлементный контроллер, с другой стороны:
@Controller
@RequestMapping("/schedule")
class MyController {
private Scheduler scheduler;
private Foo foo;
@RequestMapping(method = RequestMethod.POST)
public void scheduleSomething(Foo foo) {
this.foo = foo;
scheduler.schedule(this.foo);
}
}
Это абсолютно небезопасно для одновременного доступа, потому что все запросы поступают на один и тот же контроллер, и foo будет постоянно меняться не потокобезопасным способом. Следуйте этой линии рассуждений через все ваше приложение, и вы будете в безопасности.