|
|
|
synchronized
|
|||
|---|---|---|---|
|
#18+
Добрый день. Яву изучаю недавно. Поэтому еще не все понимаю. Вот попался мне пример из книжки. Код: plaintext 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. Вот фрагмент который вывполняется всеми сессиями (потоками) последовательно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А вот фрагмент, который выполняется параллельно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. links - общий ресурс. Методы size и get скорее всего не вызывают криминала. Однако, если бы эти методы в свою очередь обращались к общему ресурсу, могла бы возникнуть неприятность. Вопрос, как читая подобный (чужой) код можно идентифицировать методы, опасные с точки зрения многопоточности, если в документации об это ничего не говориться, а приводится только описание интерфейса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2005, 09:48 |
|
||
|
synchronized
|
|||
|---|---|---|---|
|
#18+
Если какой-то код может быть вызван из разных потоков и это может привести к "повреждению" данных, то нужно позаботится о синхронизации. Это не обязательно должна быть примитивная синхронизация ключевым словом sync*. Можно использовать read/write lock и т.п. паттерны. В твой пример специфичный. В нём нет кода который удалял бы из links записи. Если бы такой код был, то итерация по кеys могла бы привести к NullPointerException. А так, самое страшное, что может случиться, в выводимом html значение "out.println(key+" : "+count+" visits<br>");" может не соответствовать "истинному". Т.е. 1 - начинается генерация html 2 - приходит реквест с "link", который ещё не обработан в цикле 1 3 - в цикле до него до ходит очередь и выводится значение отличное от того, что было в момент времени 1. 2а - приходит реквест с "link", который уже обработан в цикле 1 3а - в html будет то значение, что было в момент времени 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2005, 10:56 |
|
||
|
synchronized
|
|||
|---|---|---|---|
|
#18+
...Однако, если бы эти методы в свою очередь обращались к общему ресурсу, могла бы возникнуть неприятность... Эти методы и так обращаются к общему ресурсу (links), только криминала они не вызывают, потомучто они читают, а одновременно читать из общего кеша по идеи может не ограниченное число потоков. Вот если бы они одновременно писали в этот кеш.... Вопрос, как читая подобный (чужой) код можно идентифицировать методы, опасные с точки зрения многопоточности, если в документации об это ничего не говориться, а приводится только описание интерфейса? А никак. Т.е. можно, но только после того, как ты на эти грабли наступишь, получишь например ConcurrentModificationException или непонятно как и кем испорченные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2005, 11:06 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33012648&tid=2152594]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
83ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 380ms |

| 0 / 0 |
