|
|
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
пыытаюсь разобраться с wait/notify написал простенькую программку. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. вывод: авторLeft Right Right почему right дважды выводиится???? я ж только один раз нотифаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:37 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerпочему right дважды выводиится???? Первый раз при запуске. Второй раз по notify(). Больше логирование поставьте чтобы порядок видеть. questionerя ж только один раз нотифаю И что? Рекомендую: http://www.rsdn.ru/forum/java/2184779.flat ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:43 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. авторLeft Right after notify in right after wait in left after notify in left after wait in right Right after notify in right 1. левый поток захватывает секцию, выводит left выполняет wait, освобождает секцию для другого потока 2. правый поток захватывает секцию выводит right нотифаит левый поток выполняет wait, освобождает секцию для другого потока 3. левый поток захватывает секцию и делает нотифай, покидает секцию 4. правый поток будится после wait, выводит Right нотифаит, уходит в wait и всё виснет. Что-то я запутался в разнице между wait и notify ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:03 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questioner, notify запускает того, кто wait ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:05 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
И в данном случае монитор не у каждого потока свой, а должен быть общий монитор, между потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:07 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
wadmanИ в данном случае монитор не у каждого потока свой, а должен быть общий монитор, между потоками. Он общий. Просто код кривой из-за этого не очевидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:09 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerЧто-то я запутался в разнице между wait и notify Что конкретно не понятно? Запутался, но вопросов не имею? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:10 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: java 1. 2. я делаю notify и wait. ожидающий поток разбудится только после исполнения строчки monitor.wait(); ? когда я делаю wait, то этот поток останавливается на этой строчке, отпускает монитор секции и ждёт пока ему сделают нотифай? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:17 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerожидающий поток разбудится только после исполнения строчки monitor.wait(); ? Конечно. Ведь мониор захвачен текущим потоком и второй поток никак не может исполнять synchronized секцию, пока текущий поток не отпустит монитор. notify() говорит спящему потоку проснуться. Тот "просыпается", но не может приступить к выполнению, так как монитор захвачен. wait() освобождает монитор и проснувшийся поток может его захватить чтобы продолжить исполнение кода. questionerкогда я делаю wait, то этот поток останавливается на этой строчке, отпускает монитор секции и ждёт пока ему сделают нотифай? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:25 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, а насчёт кривизны кода. тут естественно надо сначала нотифаить, а потом wait. А как бы передавали монитор? явно обращались бы LeftRightWaitNotifyExample.str ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:53 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
и ещё слышал что-то, что wait надо как-то в цикле вызывать потому, что какая-то бага в jvm.... или я что-то путаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:59 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerи ещё слышал что-то, что wait надо как-то в цикле вызывать потому, что какая-то бага в jvm.... И notify тоже в цикле дергать, чтоб wait уж точно-точно сработал? questionerили я что-то путаю? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:12 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questioner, там совсем не JVM и её баги рассматриваются, а обычные ситуации, когда wait отработает. авторThis method causes the current thread (call it T) to place itself in the wait set for this object and then to relinquish any and all synchronization claims on this object. Thread T becomes disabled for thread scheduling purposes and lies dormant until one of four things happens: Some other thread invokes the notify method for this object and thread T happens to be arbitrarily chosen as the thread to be awakened. Some other thread invokes the notifyAll method for this object. Some other thread interrupts thread T. The specified amount of real time has elapsed, more or less. If timeout is zero, however, then real time is not taken into consideration and the thread simply waits until notified. И для последних двух случаев предлагают решение в виде цикла, который будет проверять внутренний флаг . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:22 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
wadman, как в моем случае сделать этот флаг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:34 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
wadman, насчёт небага http://stackoverflow.com/questions/1050592/do-spurious-wakeups-actually-happen ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:36 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questioner, солбщение почти пятилетней давности... Флаг - булевская переменная, которую выставлять перед своими действиями, чтобы отличать их от перечисленных системных событий, указанных выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:20 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
wadman, я не понимаю как в моем случае этот флаг поставить. Помогите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:37 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerкак в моем случае сделать этот флаг? Ну, например, хранить состояние какой ногой сейчас "шагать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:50 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
wadmanquestioner, солбщение почти пятилетней давности... Флаг - булевская переменная, которую выставлять перед своими действиями, чтобы отличать их от перечисленных системных событий, указанных выше. там кроме spurious wakeup остальные не актуальны для тестового примера. Но вот в реальной жизни, действительно, стоит обезопасить действие проверкой состояния. Нельзя неявно хранить состояние бизнес логики в состоянии потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:52 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, то есть самый простой вариант создать какую-то третью сущность, доступ к которой будут иметь оба потока, засинхронизироваться по ней и менять ее состояние? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:57 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerа насчёт кривизны кода. тут естественно надо сначала нотифаить, а потом wait. А как бы передавали монитор? явно обращались бы LeftRightWaitNotifyExample.str ? Да, тут вагон и меленькая тележка вопросов к коду. - Почему для одного монитора целых 3 поля? - Почему левая и правая нога - разные классы. У низ разная структура? Или разное поведение? - Почему одно поле final, а остальные - нет? На сколько это безопасно? - Гарантирует ли Thread.sleep() ожидаемое поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:58 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДа, тут вагон и меленькая тележка вопросов к коду. - Почему для одного монитора целых 3 поля? - Почему левая и правая нога - разные классы. У низ разная структура? Или разное поведение? - Почему одно поле final, а остальные - нет? На сколько это безопасно? - Гарантирует ли Thread.sleep() ожидаемое поведение? И, ещё. вопрос - на сколько безопасно синхронизироваться на строковых константах и других публично доступных экземплярах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:59 |
|
||
|
wait/notify
|
|||
|---|---|---|---|
|
#18+
questionerто есть самый простой вариант создать какую-то третью сущность, доступ к которой будут иметь оба потока, засинхронизироваться по ней и менять ее состояние? Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 19:01 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38621875&tid=2127281]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
189ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 576ms |

| 0 / 0 |
