|
Spring Component
|
|||
---|---|---|---|
#18+
Добрый день. Читаю потихоньку про спринг, но в голове пока некоторая каша. Помогите, пожалуйста, разобраться. Есть два класса. Первый помечен, как компонент. Насколько я поняла, его экземпляр хранится в контейнере в единственном количестве (по умолчанию). То есть все потоки дергают один и тот же экземпляр. Ниже приведен второй класс, где несколько потоков дергают метод create компонента. Не может ли быть такого, что потоки в какой-то момент пересекутся и я получу не валидный результат (result, частично заполненный каким-нибудь чужим объектом B) И, получается, в компоненте не стоит объявлять поля класс, значения в которых потом будут меняться в методах, поскольку каждый поток будет менять их на свое значение? То есть, если я в SpringTest объявляю private int value = 5; В методе create напишу, что-то вроде value=b.getValue3(), а в методе update1 a.setValue3(value), то результат будет несколько непредсказуем? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2018, 09:16 |
|
Spring Component
|
|||
---|---|---|---|
#18+
Aliara, Все верно. Singleton - тип бина по умолчанию потоконебезопасен, если с этим бином будет производится действия из разных потоков. Поэтому рекомендуется использовать другие типы, такие как prototype, request, session, global-session (последний 3 для веб разработки) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2018, 11:49 |
|
Spring Component
|
|||
---|---|---|---|
#18+
Все примитивные типы Java (кроме long) - атомарны по чтению и записи. С модификатором volatile атомарны все примитивные типы, включая long. Атомарность сама по себе не означает у вас не будет "неожиданных" значений. Чтобы "не морщить" лоб в странных местах, Java SE API уже давно содержит пакеты java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.lock. P.S. Технически, при наличии 64-разрядных инструкций процессора long тоже атомарен. На x86-архитектуре атомарность long гарантируется, как минимум, для процессоров с SSE-расширениями. По сегодняшним меркам это означает "для всех x86", но на других архитектурах может быть по всякому. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2018, 11:49 |
|
Spring Component
|
|||
---|---|---|---|
#18+
Tsyklop, То есть пусть у меня есть класс B Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Один поток дергает строку Код: java 1.
с B b1 = new b(1,2,3); А второй поток дергает эту же строку, но с B b2 = new b(4,5,6); Могу ли я в результате получить экземпляр класса A со значениями value1 =1, а value2=5. То есть одно значение из b1, а второе из b2? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2018, 13:45 |
|
Spring Component
|
|||
---|---|---|---|
#18+
AliaraTsyklop, То есть пусть у меня есть класс B Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Один поток дергает строку Код: java 1.
с B b1 = new b(1,2,3); А второй поток дергает эту же строку, но с B b2 = new b(4,5,6); Могу ли я в результате получить экземпляр класса A со значениями value1 =1, а value2=5. То есть одно значение из b1, а второе из b2? Как вам выше уже написали, синглтоны не thread safe, но это не относится к локальным переменным - в данном случае A a = new A (в каждом потоке будут "свои" локальные переменные). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2018, 04:02 |
|
Spring Component
|
|||
---|---|---|---|
#18+
Aliara, основная проблема тут не в Singleton'ах самих по себе, а в появлении shared mutable state. Уберите состояние и делайте компоненты Singleton'ами сколько влезет. Собственно, в типичном Веб-приложении 99% компонентов, которые инжектятся - это всякие сервисы, контроллеры, DAO - им состояние ни к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2018, 12:35 |
|
|
start [/forum/topic.php?fid=59&fpage=40&tid=2121820]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 335ms |
total: | 470ms |
0 / 0 |