|
|
|
Volatile
|
|||
|---|---|---|---|
|
#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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. Правильно ли мне кажется, что спецификатор volatile здесь лишний? Так как переменная running уникальна для потока (приватная и не статическая), т.е. другой поток не может ее изменить. И мы будем для каждого потока всегда иметь правильное значение этой переменной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 14:56 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
При создании двух классов clicker в каждом из них создастся своя переменная running, т.е. в памяти будет 2 переменные running - ведь так же? А volatile подошло бы в случае, если переменная running была бы внешней по отношению к этим двум потокам, например, передавалась бы в конструктор класса clicker, как параметр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 15:05 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreenПравильно ли мне кажется Нет, не правильно. Поток и класс Thread это не одно и тоже. Класс Thread это Java API для работы с потоками, а не сам поток. Так вот к вашей переменной running идёт обращение из разных потоков. Запись происходит в потоке, который исполняет метод main() - в конструкторе и при вызове stop(). А чтение происходит в другом потоке, который вы запустили вызвав метод start(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 15:06 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreenПри создании двух классов clicker в каждом из них создастся своя переменная running, т.е. в памяти будет 2 переменные running - ведь так же? Да. faustgreenА volatile подошло бы в случае, если переменная running была бы внешней по отношению к этим двум потокам Классы и объекты это не потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 15:07 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Спасибо за информацию, пока не до конца все понятно, пойду почитаю чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 15:10 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreen, замените все обращения к переменной на запись и чтение через свойство (get/set методы). В геттере и сеттере логируйте имя потока а лучше даже весь дамп стэка потока. Может понятнее будет. Ну, и добавьте sleep() в ваш while(true). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 15:15 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Вроде разобрался: 1). Потоки, созданные классами hi и lo не могут изменить переменные running друг друга. 2). Метод main может изменять переменную running обоих потоков. Так же как и сами потоки могут менять свою переменную. авторПоток и класс Thread это не одно и тоже. Класс Thread это Java API для работы с потоками, а не сам поток. Вот тут у меня наверное были проблемы с пониманием: Код: 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. Вывод результатов выполнения: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 17:03 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Код: java 1. * Т.е. Поток, в котором выполняется метод main, может менять значения переменных running в потоках созданных класами hi и lo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 17:10 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю еще один момент по примеру выше: Если у нас во время выполнения в одном из потоков (или обоих) выскочит exception или error, то главный поток этого не заметит, но при этом итоговый результат будет неверный - счетчик clicker будет иметь значение, которое у него было на момент exception. Т.е. такой код лучше не писать? Набросал пример, на эту тему: Код: 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. Т.е. если даже поток "умрет", класс никуда не денется и его члены будут доступны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 18:19 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreenТ.е. если даже поток "умрет", класс никуда не денется и его члены будут доступны? Классы это те же объекты, только особые. Все объекты лежат куче. Время жизни объектов это немного отдельная тема от потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 20:45 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreenто главный поток этого не заметит, но при этом итоговый результат будет неверный - счетчик clicker поскольку Вы не попросили сделать счетчик волатильным, то главный поток имеет право его видеть любым. Вне зависимости от того, когда там что произошло в другом потоке. :) Правда на x86* Вы, скорее всего, этого не заметите. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2017, 22:21 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевfaustgreenто главный поток этого не заметит, но при этом итоговый результат будет неверный - счетчик clicker поскольку Вы не попросили сделать счетчик волатильным, то главный поток имеет право его видеть любым. Вне зависимости от того, когда там что произошло в другом потоке. :) Правда на x86* Вы, скорее всего, этого не заметите. :) Достаточные гарантии видимости(HB) здесь создаёт join. Увидит ровно то, что было перед ексепшеном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2017, 20:02 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
no56892, Ну да, слона (join) то я и не заметил. https://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html then all the statements executed by the terminated thread have a happens-before relationship with all the statements following the successful join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2017, 23:34 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
Вычитал еще такую вещь про volatile переменную: Если поток A записывает или читает volatile -переменную, а впоследствии поток B производит чтение или запись этой переменной, то значение этой переменной, а также всех общих переменных(shared) (даже не volatile ) всегда будут актуальными для потока B (на момент чтения или записи volatile -переменной). Аналогичная ситуация с synchronized блоками или методами. Возникли вопросы: 1). Если есть 2 общие переменные для 3-х потоков: int a и volatile int b . -Первый поток записывает новое значение в обе переменных. -Второй поток сначала читает волатильную переменную, потом обычную. -Третий поток читает сначала обычную переменную, потом волатильную. В примере все действия происходят последовательно, сначала отрабатывает поток 1, потом 2, и затем поток 3. В этом случае, если я правильно понимаю: Поток №2 всегда будет видить актуальные значения обеих переменных, а поток №3 всегда будет иметь актуальное значение volatile переменной, но не всегда обычной? 2). Где можно применить описанное выше свойство (актуальная видимость всех переменных при операциях с volatile-переменными)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 01:03 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreenВычитал еще такую вещь про volatile переменную: Если поток A записывает или читает volatile -переменную, а впоследствии поток B производит чтение или запись этой переменной, то значение этой переменной, а также всех общих переменных(shared) (даже не volatile ) всегда будут актуальными для потока B Про запись вообще не известно откуда взятый бред, а что касается чтения, то можно говорить, о том что поток B увидит все изменения в памяти сделанные потоком A , только когда B прочел из volatile именно то что записал туда A , а не что-нибудь другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 08:39 |
|
||
|
Volatile
|
|||
|---|---|---|---|
|
#18+
faustgreen2). Где можно применить описанное выше свойство (актуальная видимость всех переменных при операциях с volatile-переменными)? Самый очевидные - флаг "я всё посчитал, можете читать результаты". Флаг - volatile, результаты- обычные переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 08:56 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39518239&tid=2122503]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
81ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 214ms |
| total: | 407ms |

| 0 / 0 |
