
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
09.01.2017, 08:06
|
|||
|---|---|---|---|
Изучаю, появляются вопросы |
|||
|
#18+
Читаю пока книжку "Герберт Шилдт. Java 8. Полное руководство. Девятое издание". Первый вопрос. Вот код (со страницы 307), он вроде работает: Код: 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. Вопрос 1. Может ли между операторами строк 30 и 31 измениться значение this.v? Значит ли это что надо завести копию в локальной переменной до вызова notify() и возвращать её? Вопрос 2. Что если в классе у меня есть несколько полей доступ к которым надо разделять отдельно (в golang для этого я бы использовал мутексы с разным именем)? Как в java поступают в таком случае? Заводят отдельный класс и делают уже его полем-хранителем нужных данных, и монитор (wait-notify) работает в рамках этого отдельного экземпляра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.01.2017, 08:52
|
|||
|---|---|---|---|
|
|||
Изучаю, появляются вопросы |
|||
|
#18+
Shr, 1. пока ваш монитор занят (не вышли из синхронайза, либо не выполнили wait) - никто в него не зайдет, но никто не помешает изменить поле без синхронизации (про видимость изменений говорить не будем) 2. Синхронизироваться можно не только на this, можно завести отдельные мониторы и синхронизировать по ним блоки кода (а не методы) Кроме того, когда у вас монитор публичный, то его может заблокировать любой (без рефлексии) - и у вас все остановится. Так же, в этом случае, ваш notify может "проглотить" чужой код - как говорят - не уверен - поставь notifyAll (ухудшается производительность, но уведомление не потеряется) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.01.2017, 09:26
|
|||
|---|---|---|---|
|
|||
Изучаю, появляются вопросы |
|||
|
#18+
ShrВопрос 1. Может ли между операторами строк 30 и 31 измениться значение this.v? Значит ли это что надо завести копию в локальной переменной до вызова notify() и возвращать её? Нет. Ведь модификация происходит только в synchronized методе, и строки 30, 31 тоже синхронизированы по тому же мутексу. ShrВопрос 2. Что если в классе у меня есть несколько полей доступ к которым надо разделять отдельно (в golang для этого я бы использовал мутексы с разным именем)? Как в java поступают в таком случае? Заводят отдельный класс и делают уже его полем-хранителем нужных данных, и монитор (wait-notify) работает в рамках этого отдельного экземпляра? synchronized метод это аналог такого кода: Код: java 1. 2. 3. 4. 5. В Java любой объект может быть мутексом. Соответственно можно делать так: Код: java 1. 2. 3. 4. 5. 6. Но, если нужны какие-либо изыски, то synchronized, обычно, идёт лесом, так как есть Java Concurrent Utils. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.01.2017, 11:53
|
|||
|---|---|---|---|
Изучаю, появляются вопросы |
|||
|
#18+
Спасибо, понятно. С приватным монитором должно быть где-то так? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&mobile=1&tid=2123293]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
| others: | 202ms |
| total: | 348ms |

| 0 / 0 |
