|
|
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
Какая разница между этим Код: plaintext 1. 2. 3. 4. 5. и этим Код: plaintext 1. 2. 3. И еще, кто знает, подскажите ссылки с ресурсами в которых описывается многопоточность, синхронизация, создание пулов, кешей и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2005, 17:12 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
разница в получаемом байткоде и след-но скорости работы :) первое точно не хуже, чем второе (JIT может сравнять). А работает одинаково. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2005, 17:37 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
java script != java А работает одинаково. что и требовалось доказать:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2005, 17:46 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
Еще раз с этим всем столкнулся и уж окончательно разобрался. Вот такой способ: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. можно еще и так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Только у меня возник еще один вопрос, при создании объекта какого нить класса, выделяется память для нестатических полей, вопрос - кде хранятся все статичестее поля? И еще, со ссылкой this все понятно, а на что указывает вот это - this.getClass(). Работать я с этим всем умею, на уровне подсознания:) но все-таки хочется узнять, как это все в памяти организуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 11:41 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
авторкде хранятся все статичестее поля? Если мне не изменяет память, в с++ они хранятся в "куче" вместе с функциями. Поскольку с - предок явы, то думаю и в ней дело обстоит так же. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 14:58 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
zhas авторкде хранятся все статичестее поля? Если мне не изменяет память, в с++ они хранятся в "куче" вместе с функциями. Поскольку с - предок явы, то думаю и в ней дело обстоит так же. :) Спасибо. Я думаю, что во всех языках именно так дело и обстоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 15:03 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
Почему в подобных методах: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. пишут вот так: Код: plaintext 1. 2. 3. 4. а не вот так: Код: plaintext 1. 2. 3. 4. В чем разница? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:39 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
потому что givenLocks могло измениться, пока lock был у другого объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 18:53 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUsпотому что givenLocks могло измениться, пока lock был у другого объекта. так ведь все синхронизированно, и почему while(...), а не If(...), ведь в любом случае проверка произойдет только один раз и потом поток либо попадет в очередь, либо получит блокировку. Ничего не понимаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 19:00 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
wessen NotGonnaGetUsпотому что givenLocks могло измениться, пока lock был у другого объекта. так ведь все синхронизированно, и почему while(...), а не If(...), ведь в любом случае проверка произойдет только один раз и потом поток либо попадет в очередь, либо получит блокировку. Ничего не понимаю... Ну, представь. У тебя висит 10 потоков. В них вызывают метод getWriteLock(). 9 из этих потоков заблокированны на mutex (т.к после первого вызова givenLocks=-1). Разблокирован поток может быть только при условии, что givenLocks == 0. Допустим не блокированный поток вызвал метод void freeWriteLock() { synchronized(mutex){ givenLocks = 0; mutex.notifyAll(); } } После этого вызова 9 методов становяся в очередь на выполнение. Они начнут работать друг за дружкой, как только особождается mutex. Но! Нам этого не нужно. Т.к. метод getWriteLock() служит для получения writeLock'. Поэтому в первом пробуждённом потоке выставляется givenLocks = -1 и происходит выходит из блока синхронизации. Тогда выполение переходит к следующему потоку по цепочке. В нём делается проверка условие, поток понимает, что ему ещё спать-да-спать и вызовется метод mutex.wait(). Аналогично поступят остальные методы. Если бы у нас было if - все бы они продолжили выполение. Можно было бы поступить иначе: вместо mutex.notifyAll() в из freeWriteLock() вызвать метод mutex.notify() и заменить while на if. Но тогда нам пришлось бы гарантировать, что при вызове метода notify условие givenLocks !=0 всегда истинно. Если предположить, что givenLocks отвечает за кол-во ReadLock'ов, то осуществить это будет проблемотично... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 20:10 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
Поэтому в первом пробуждённом потоке выставляется givenLocks = -1 и происходит выход из блока синхронизации. Затем выполение переходит к следующему потоку по цепочке. В нём делается проверка условия, поток понимает, что ему ещё спать-да-спать и вызывает метод mutex.wait(). Аналогично поступают остальные потоки. Если бы у нас было if, то все потоки возобновили бы свою работу. Можно было бы поступить иначе: вместо mutex.notifyAll() в методе freeWriteLock() вызвать метод mutex.notify() и заменить while на if. Но тогда нам пришлось бы гарантировать, что при вызове метода notify условие givenLocks !=0 всегда истинно. Если предположить, что givenLocks отвечает за кол-во ReadLock'ов, то осуществить это было бы проблематично... off: сорри за русский, спать он уходит раньше, чем я :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 20:15 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
После этого вызова 9 методов становяся в очередь на выполнение. Они начнут работать друг за дружкой, как только особождается mutex. А с какого места начнут выполнятся эти 9-ть потоков после вызова notifyAll, я думал, что с начала синхронизированного блока или метода, выходит, что нет, он начнет выполнятся после строки mutex.wait()? Если так, то понятно, почему while, а не if. Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 13:24 |
|
||
|
Синхронизация
|
|||
|---|---|---|---|
|
#18+
wessen После этого вызова 9 методов становяся в очередь на выполнение. Они начнут работать друг за дружкой, как только особождается mutex. А с какого места начнут выполнятся эти 9-ть потоков после вызова notifyAll, я думал, что с начала синхронизированного блока или метода, выходит, что нет, он начнет выполнятся после строки mutex.wait()? Если так, то понятно, почему while, а не if. Я прав? Прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 15:54 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2152865]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 366ms |

| 0 / 0 |
