Когда вы используете singleton
scope из контейнера Spring, вы указываете, что все потоки, которые извлекают bean-компонент из контейнера, будут использовать один и тот же экземпляр. Таким образом, в этом случае, когда список состояний элемента совместно используется и может изменяться между потоками, вам нужно будет синхронизировать доступ к списку, чтобы защитить приложение от ConcurrentModificationException
.
Однако обычная практика в Spring - создавать приложение с объектами без состояния, состояние которых не будет меняться в течение всего жизненного цикла приложения.
В случае области действия session
вероятность возникновения проблемы параллелизма может быть меньше, поскольку компонент будет доступен только вошедшему в систему пользователю. Тем не менее, возможно (по крайней мере, в Интернете) иметь несколько запросов на один и тот же сеанс, и в этом случае вам нужно будет принять те же меры предосторожности, как если бы компонент был одноэлементным.
Опять же, лучший способ защитить себя - постараться сохранить свой бин как можно без гражданства. Если у вас есть компонент, для которого требуется состояние, вам следует рассмотреть возможность использования области действия prototype
, которая каждый раз получает новый экземпляр компонента из контейнера.