|
|
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
А ещё, расскажи, если не трудно, для чего true/false. Не проще ли через Set и проверку на null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 12:29:55 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBlazkowiczАаа, там предыдущее значение выталкивается. Я подумал что флаг. А NPE не будет ли при анбоксинге null? В любом случае при первом заходе там всегда не true. Рантайм в цикл вообще не попадёт. Ой, блин что-то я гоню. Это же только для того случая если строка есть. А ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock? Когда поток переходит в состояние wait он освобождает монитор объекта. Поэтому все строки которые соответствуют map.put(s, true) == true - т.е предыдущее значение для данного ключа(строки) == true - будут переходить в состояние wait. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 12:59:15 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИ ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке? Когда поток вызывает lock.notifyAll(); он переводит все потоки(которые висят на данном локе) в активное состояние. Если у нас есть стек потоков с одним ключом (s) которые на момент lock.notifyAll() висели на нашем локе - то первый из них выигрывает ресурс map.put(s, true) == false и работает с критической областью, а остальные по условию map.put(s, true) == true переходят в состояние wait. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 13:06:50 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
notifyAll() тоже ведь завернуть нужно в synchronized ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 13:10:59 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanКогда поток вызывает lock.notifyAll(); он переводит все потоки(которые висят на данном локе) в активное состояние. Если у нас есть стек потоков с одним ключом (s) которые на момент lock.notifyAll() висели на нашем локе - то первый из них выигрывает ресурс map.put(s, true) == false и работает с критической областью, а остальные по условию map.put(s, true) == true переходят в состояние wait. Нее, re-entrancy, это про один поток. Если вдруг поток вызовет метод, положит строку и потом в какой-то момент снова вызовет этот же метод. Он же залочится до тех пор пока кто-то по другой строке его не разбудит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 13:13:33 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА ещё, расскажи, если не трудно, для чего true/false. Не проще ли через Set и проверку на null? Можно и через Set - только какую имплиминтацию брать? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 13:42:23 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
OOsalivanМожно и через Set - только какую имплиминтацию брать? Collections.newSetFromMap() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 13:47:32 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczLock рекомедуют к использованию вместо wait/notify. Но мне любопытно на счет производительности. Lock устроен горзда сложнее с кучей вызовов методов. Насчет производительности - многое зависит от имплементации JVM, но если брать HotSpot, то рекомендуют использовать synchronized в случае если с кодом работает в основном один поток, причем если синхронизация происходит все время по одному объекту(так как возможно применить так называемый biased locking), в данном случае это не наблюдается. Вариант когда с кодом работает один поток, но синхронизация по разным объектам и количество "столкновений на мониторе" невысоко, то оба подхода дают примерно одинаковый результат, так как оба работают на CASе, а вот выигрывать Lock начинает при большом столкновении, так как synch сразу раздувается до OS-level монитора, а Lock имплементирован так, что может адаптивно подстраиваится, и перейти на OS-level и обратно при определенных условиях. Все это более подробно описывается тут - http://www.javaspecialist.ru/2011/11/synchronized-vs-reentrantlock.html#more BlazkowiczА ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock? И ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке? Вот именно поэтому я и говорю, что надо использовать ReentrantLock, причем он должен быть не глобальным, а содержаться в Map Код: java 1. и лочить надо именно не глобальный лок, а тот что доступен по ключу-строке, тогда столкновений на разных строках на одном мониторе не будет, что значительно увеличит производительность, как вы и заметили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 14:23:26 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНее, re-entrancy, это про один поток. Если вдруг поток вызовет метод, положит строку и потом в какой-то момент снова вызовет этот же метод. Он же залочится до тех пор пока кто-то по другой строке его не разбудит. Ну а в случае с обычной синхронизацией (через синхронайз) что произойдет? Это по моему общая проблема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 14:31:34 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
забыл никBlazkowiczА ещё вопрос, все ведь строки на одном локе висят. Тогда если две разных строки в 2х потоках уже существуею, они ещё и с друг другом будут бодаться за lock? И ещё вопрос к коду. Как отработает re-entrancy, если метод вызовется для той же строки, но в том же потоке? Вот именно поэтому я и говорю, что надо использовать ReentrantLock, причем он должен быть не глобальным, а содержаться в Map Так какую проблему решает ReentrantLock по отношению к Object.wait ? Object.wait просто переводит поток в состояние ожидания, и из- за того что этот метод релизит монитор после перевода, то может использоваться сколько угодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 14:45:44 |
|
||
|
Синхронизация по String
|
|||
|---|---|---|---|
|
#18+
shainsky Я придумал такой код, но есть подозрения в том, что он неоптимален: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Строка workWith.remove(s); лишняя, в случае, если потоков будет больше двух и они параллельно будут вызывать этот метод, то есть вероятность, что второй и третий потоки зайдут одновременно в синхронизированный блок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2012, 18:43:44 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37736269&tid=2132140]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
64ms |
get topic data: |
20ms |
get forum data: |
8ms |
get page messages: |
96ms |
get tp. blocked users: |
4ms |
| others: | 356ms |
| total: | 594ms |

| 0 / 0 |
