|
|
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Хочу таки чётко разобраться: 1. final есть такой класс( модель, версия 1 ): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Это пример публикации через гонку( публикация, версия 1 ). Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. так как map объявлена final - это валидно и на экран гарантированно будет выведено 1 2.volatile А что если сделать так( модель версия 2 ): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Я так понимаю, что публикация, версия 1 ничего нам не гарантирует. Как в таком случае безопасно опубликовать? ( публикация, версия 2 ): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 3. без volatile/final Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. я так понимаю публикация, версия 1 и публикация, версия 2 работать не будут. По поводу публикация, версия 2 я совсем не уверен. Есть ли при такой имплементации способ безопасно опубликовать объект? (может быть через synchronized ?) Я бы хотел в ответ на этот пост получить: 1. Оценку того, что я написал 2. Понять какие ещё способы безопасной публикации возможны(желательно полный пример кода Main). 3. Если что-то написано неправильно, то прошу разъяснить в деталях, что именно, почему и как поправить. 4. Может ли какой-то из предложенных вариантов вывалить NullPointerException ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 11:05 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Для начала, 1 - это невалидно. Код сначала публикует ссылку на мапу, а потом её меняет. Нужно наоборот: Код: java 1. 2. 3. 4. 5. 6. Все-таки почитайте оригинальный документ по JMM, ну или статьи на хабре какие-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 11:16 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scfДля начала, 1 - это невалидно. Код сначала публикует ссылку на мапу, а потом её меняет. Нужно наоборот: Код: java 1. 2. 3. 4. 5. 6. Все-таки почитайте оригинальный документ по JMM, ну или статьи на хабре какие-нибудь.\ Честно признаюсь, я не достаточно подготовлен для чтения JMM. Если Вы действительно этом можете, я искренне за Вас рад. Статьи на хабре почитаны. Насколько я понял моментом публикации final поля является завершение конструктора и магический freeze action всё сделает. То, что говорите Вы, справедливо для volatile. Раз даже в этом мы не сходимся, хотелось бы ссылку на какую-нить статью, которая это объясняет. Ну или мнение большинства меня тоже убедит, но я так понял, большинство пишущих тут не знают ответа, а на всякий случай перестраховываются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 12:10 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 12:57 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Пересмотрел JMM. Оказалось, что я был неправ и мапу даже так публиковать нельзя. freeze относится только к самим final-полям, и НЕ относится к содержимому объектов Но у x86 модель памяти достаточно строгая и многие "неправильные" практики на самом деле работают. Вот интересная статья на тему: https://shipilev.net/blog/2014/safe-public-construction/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 12:57 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
questioner, имхо неправильный у них ответ. Мешают в кучу JMM (теорию) и барьеры (конкретную реализацию на конкретных процессорах). Плюс цитируют одно (объект называется полностью инициализированным и после этого его final поля видны), а выводы делают другие (объект полностью инициализирован, значит, полностью виден) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 13:02 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scfПересмотрел JMM. Оказалось, что я был неправ и мапу даже так публиковать нельзя. freeze относится только к самим final-полям, и НЕ относится к содержимому объектов Это само собой. Но h-b отношение появляется при inplace инициализации final поля. А соответственно после разморозки должно быть видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 13:33 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, эээ где это написано, что инициализация final поля - это точка HB? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 14:13 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scf, jsr-133 9.2.2 Код: plaintext 1. 2. между записью и фризом есть барьер. Соответственно, то что было до записи (вызов функции) за ним должно обеспечиваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 15:28 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, барьер-то есть, но в JMM ничего про барьеры не написано, это деталь реализации JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 15:43 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scf, hb не увидел на рисунке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 15:45 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, это в каком конкретно документе? Можете ткнуть вот сюда: http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 15:58 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 16:01 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Учитывая, что официальная страница JCP ведет на JLS , где ничего такого нет, я все больше склоняюсь к мысли, что авторы JMM просто активно притягивают свою модель к реальному железу . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 16:29 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scf, если хорошо пороешься, то и на этот сайт оттуда же попадешь. Прячут все как партизаны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 16:38 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, jsr-133 - это спецификация модели памяти какой должна быть (начиная с 1.5). А JLS приведенная тобой - это дока по ее реализации в конкретной версии. Увы но вторая менее подробная, чем первая. В ней такие вопросы сглажены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 16:43 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 18:29 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
no56892 Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. согласен. Да, очевидно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 19:25 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
no56892 Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. А можете пояснить фразу про больший happens-before: Что это значит и у кого он больше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 19:28 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
scfСергей Арсеньев, Учитывая, что официальная страница JCP ведет на JLS , где ничего такого нет, я все больше склоняюсь к мысли, что авторы JMM просто активно притягивают свою модель к реальному железу . Не читайте кукбук! Ещё раз- это простейший пример частичного выполнения JMM. Hostspot jvm работает не так . Сергей АрсеньевА JLS приведенная тобой - это дока по ее реализации в конкретной версии. нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 20:23 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
questioner, Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 21:03 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Да кстати, еще одно интересное отличие для volatile в вышеописанном случае, что-бы увидеть этот самый hb, ее нужно прочитать, в тоже время манипуляции через final поля в конструкторе - дают видимость и без их чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 21:46 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Кароче, в итоге: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2017, 21:54 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
no56892Да кстати, еще одно интересное отличие для volatile в вышеописанном случае, что-бы увидеть этот самый hb, ее нужно прочитать, в тоже время манипуляции через final поля в конструкторе - дают видимость и без их чтения. Что такое видимость без чтения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 10:39 |
|
||
|
Пример безопасной, небезопасной и публикации через гонку.
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Что бы увидеть действия произошедшие в кнструкторе через ссылку final поля не обязательно читать само final поле перед этим. См пример выше со Статик переменными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 13:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39398444&tid=2123174]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
58ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 370ms |

| 0 / 0 |
