|
|
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
Добрый день. Такой вопрос... Есть веб сервис SOAP JAX-WS, в нем веб методы. Клиенты этого веб сервера могут вызывать эти методы. Когда клиент вызавает метод веб сервиса, то для этого клиента создается отдельной поток для веб сервиса? Сервис: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Так вот, метод someMethod при выполнении блокирует переменную responceSB. Если в этот момент другой клиент вызовет someMethod, то будет ли ему доступ к responceSB. Бо если PoiskService для каждого вызова исполняется в отдельном потоке, то все нормально тогда за переменную responceSB можна не беспокоится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 11:39:30 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
denis11111Когда клиент вызавает метод веб сервиса, то для этого клиента создается отдельной поток для веб сервиса? Как бы да. Но новый поток не всегда создаётся. Он берется из пула потоков, чтобы экономить время создания. denis11111Так вот, метод someMethod при выполнении блокирует переменную responceSB. Ох и каша в голове. Метод не "блокирует" переменну. Во-первых она volatile, что к "блокировке" имеет слабое отношение. Во-вторых "блокируются" потоки, а не "переменные". Переменная хранит значение. Она не может блокироваться. Поток выполняет код, если он "блокируется", то он его не выполняет, пока не "разблокируется". denis11111 Если в этот момент другой клиент вызовет someMethod, то будет ли ему доступ к responceSB. Это зависит от того как JAX-WS реализация инстанциирует PoiskService. Надо спеку почитать. Возможны два варианта. Либо каждому потоку свой экземпляр PoiskService. Тогда у каждого потока своя переменная responceSB. Либо Один экземпляр PoiskService на все потоки - этот вариант более вероятен. denis11111Бо если PoiskService для каждого вызова исполняется в отдельном потоке, то все нормально тогда за переменную responceSB можна не беспокоится. Что же это за сервер, такой где все клиенты обслуживались бы одним единственным потоком? Disruptor получится. :) В общем не в том направлении копаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 11:51:02 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
В меня вебсервис ищо @Stateless() Вот так-то ). По ходу там все нормально, и как только клиент вызивает веб метод, то создается новой экземпляр веб сервеса. BlazkowiczОх и каша в голове. Метод не "блокирует" переменну. Во-первых она volatile, что к "блокировке" имеет слабое отношение. Во-вторых "блокируются" потоки, а не "переменные". Переменная хранит значение. Она не может блокироваться. Поток выполняет код, если он "блокируется", то он его не выполняет, пока не "разблокируется". Просто я не знаю как это по правилах "сказать", но точно знаю, пока "volatile StringBuilder responceSB;" сидит в одном потоке, другой в эту переменную нечего не додаст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 12:07:52 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
denis11111В меня вебсервис ищо @Stateless() Вот так-то ). По ходу там все нормально, и как только клиент вызивает веб метод, то создается новой экземпляр веб сервеса. Тут есть другая ловушка. В определенный момент может отказаться что новый экземпляр не создаётся, а используется какой-то который уже был использован другим потокм ранее. Если это EJB, то стоит почитать про спецификацию Stateless, как там распраделяются экземпляры. denis11111Просто я не знаю как это по правилах "сказать", но точно знаю, пока "volatile StringBuilder responceSB;" сидит в одном потоке, другой в эту переменную нечего не додаст. Ваше "точно знаю" не имеет ничего общего с реальностью. Если вы меняете значение поля responceSB это одно. Если вы меняете значение экземпляра StringBuilder, на которое ссылается это поле, это другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 12:18:25 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВаше "точно знаю" не имеет ничего общего с реальностью. Если вы меняете значение поля responceSB это одно. Если вы меняете значение экземпляра StringBuilder, на которое ссылается это поле, это другое. Менять значение поля - ? Менять значение экземпляра - ? Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 12:28:26 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
denis11111Просто я не знаю как это по правилах "сказать", но точно знаю, пока "volatile StringBuilder responceSB;" сидит в одном потоке, другой в эту переменную нечего не додаст. Похоже volatile перепутано с ThreadLocal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 12:30:37 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. Да. Значение s не меняется. Меняется состояние объекта, на который ссылается s. volatile на это вообще не влияет. Код: java 1. Меняется значение переменной s. volatile гарантирует что другой поток, использующий это поле сможет увидеть новое значение, а не старое из своего кеша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 12:33:22 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМеняется значение переменной s. volatile гарантирует что другой поток, использующий это поле сможет увидеть новое значение, а не старое из своего кеша. Так, так... Тут что-то не то) Да volatile таки не то что я думал. Вот куча потоков работают з volatile StringBuilder responceSB; Каждий из них старается записать туда такое "<1>" или "<4>". В результате на виходе должно было бить: "<2><1><4><3>" Без volatile выходило "<<2>1><4>><3". А з volatile все нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 13:05:39 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
какая-то каша. Надо чтобы все потоки писали в один буфер - используйте синхронизацию, либо StringBuffer; Надо чтобы каждый поток писал в свой буфер - используйте ThreadLocal<StringBuilder>, либо стек volatile тут вообще ни при чем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 13:23:21 |
|
||
|
SOAP и потоки
|
|||
|---|---|---|---|
|
#18+
denis11111Каждий из них старается записать туда такое "<1>" или "<4>". В результате на виходе должно было бить: "<2><1><4><3>" Без volatile выходило "<<2>1><4>><3". А з volatile все нормально. Побочный эффект и недостаток тестирования. Возможно из-за более долгого доступа к volatile ссылке, ваши потоки успевают записать свои куски целиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2013, 13:29:00 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38194625&tid=2129727]: |
0ms |
get settings: |
15ms |
get forum list: |
28ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
69ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
82ms |
get tp. blocked users: |
3ms |
| others: | 302ms |
| total: | 541ms |

| 0 / 0 |
