Ваш класс не будет потокобезопасным, если вы пометите его как одноэлементный в контексте с момента инициализации
поля с пометкой "new
" вручную, что происходит один раз при создании бина, и из которых у вас будет один экземпляр в памяти, такой как ваш синглтон, и, соответственно, ваши потоки совместно используют экземпляр CustomGxSessionIdCacheImpl, PcrfRecord и так далее.
Если вы можете заставить эти экземпляры взять под контроль контекст весны, как:
<bean id="customGxSessionIdCache" class="package.CustomGxSessionIdCacheImpl" scope="prototype">
и автоматически связать их в PcrfSimulator, например:
@Autowired
private final CustomGxSessionIdCacheImpl gxSessionIdCache
после этого, как только ваш код получит доступ к gxSessionIdCache, Spring создаст новый экземпляр для каждого доступа и для каждого потока соответственно. Любые другие методы в Singleton должны были быть помечены synchronized
, так как они открыты для многопоточного доступа. Весенние синглтоны - это обычные синглтоны.
Я думаю, неправильно говорить, что если у вас вообще нет состояния, значит, все поточно-ориентировано. Если вы думаете о низком уровне, методы также имеют состояния, то есть локальные переменные, и если к ним обращаются несколько потоков, вы также можете испытывать головную боль.