|
|
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
pavel_nvТак вроде бы если ссылка на объект "утекла" в конструкторе, то не гарантируется что другой поток увидит уже установленное значение 42?В рассматриваемом примере присвоение 42 не может "убежать" из конструктора из-за synchronized-блока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 08:39 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoachВ рассматриваемом примере присвоение 42 не может "убежать" из конструктора из-за synchronized-блока. Простите по совсем другой причине. И sync блок ну ни как на эту причину не влияет. Ссылка если может убежать из конструктора, то даже еще до того как он начнется. :) Но в данном примере она не утекает ибо публикуется не из конструктора, а снаружи и для этого случая sync и является барьером. Так что если у нас платформа, которая гарантирует, что простое присвоение адреса атомарно - то все пучком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 09:30 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевПростите по совсем другой причине. И sync блок ну ни как на эту причину не влияет. Ссылка если может убежать из конструктора, то даже еще до того как он начнется. :)Признаться, я не понял, что вы имели ввиду. Я говорил про следующее. Из-за race conditoin у нас как минимум может быть null и 42. Вопрос заключается только в том, может ли быть 0. Если убрать synchronized(), то он мог бы быть вследствие следующего реордеринга: Код: java 1. 2. 3. Поэтому, если второй поток прочитает значение после шага 2, но до шага 3, то мы получим ноль. И я уже приводил на прошлой странице код, который наглядно это демонстрирует, просто запустите его: Код: 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. Если же мы добавим synchronized в конструктор, то такая последовательность становится запрещенной, и теперь код первого потока может отработать только так: Код: java 1. 2. 3. 4. 5. Так, шаги 1 и 2 не могут быть переставлены по понятной причине - программа не будет работать. А шаги 2 и 3 не могут быть переставлены из-за acquire-release семантики, которую synchronized() вставляет между ними. Поэтому второй поток никогда не увидит 0. А вы что имел ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 09:49 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Вот, максимально упростил код, который воспроизводит этот data race: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 09:56 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoachВот, максимально упростил код, который воспроизводит этот data race Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 10:29 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило)Ну вы же в академики метите у нас, и сами ответить не можете? Сделаю это за вас - свалится этот код на конкретном процессоре, операционке и версии Java станет буквально через доли секунд, когда Java скомпилирует метод конструктор MyClass. Либо она компилирует его с реордерингом, либо нет. Железо напрямую на этот код не влияет. Оно влияет опосредованно - под конкретное железо могут быть или не быть те или иные оптимизации, которые в комплексе приводят к реордерингу сгенерированного JIT-ом кода. У меня этот код валится на Java7 вплоть до b45 (на более старших не проверял просто), Windows7, Core i5/i7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 10:47 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoachсвалится этот код или нет на конкретном процессоре, операционке и версии Java станет ясно буквально через доли секунд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 10:48 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoachА вы что имел ввиду? pavel_nv говорил про теоретический случай - " если ссылка на объект "утекла" в конструкторе ". Что подразумевает публикацию ссылки из конструктора, в том числе и предка. У Вас это не рассматривалось. Как Вы сами понимаете добавление блоков sync, на эту ситуацию никаким бы образом не повлияло. О чем я Вам и написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 10:52 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев , Все равно не понимаю, какая ссылка и куда утекла. Можете по шагам показать последовательность действий, про которую вы говорите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:03 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoachbuldozer01Эхх сколько же этот код на видеx86 должен работать чтоб выстрелило)Ну вы же в академики метите у нас, и сами ответить не можете? Сделаю это за вас - свалится этот код на конкретном процессоре, операционке и версии Java станет буквально через доли секунд, когда Java скомпилирует метод конструктор MyClass. Либо она компилирует его с реордерингом, либо нет. Железо напрямую на этот код не влияет. Оно влияет опосредованно - под конкретное железо могут быть или не быть те или иные оптимизации, которые в комплексе приводят к реордерингу сгенерированного JIT-ом кода. У меня этот код валится на Java7 вплоть до b45 (на более старших не проверял просто), Windows7, Core i5/i7. Да согласен. У меня вот не получилось добиться того чтобы свалилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:11 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoach Сергей Арсеньев , Все равно не понимаю, какая ссылка и куда утекла. Можете по шагам показать последовательность действий, про которую вы говорите? Иногда ссылку на объект может опубликовать сам конструктор. Если это предок Вашего класса, то Ваше hb ему будет фиолетово. Хотя я вот хоть убей не понимаю - чем эти два блока лучше 1 volatile? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:13 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Тем что у volatile будет {"null" , 0 , 42} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:15 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01, Если GLOBAL будет volatile? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:23 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Нет если "a" будет volatile ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:26 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01У меня вот не получилось добиться того чтобы свалилосьКак запускаете? Для чистоты эксперимента надо запускать из консоли. Если вы запускаете из IDE, то может быть у вас компиляция не происходит. Например, если вы запускаете с дебагером, или если ваша IDE запускает код внутри какой-то своей хитрой обертки. У меня нормально сваливается при запуске из IDEA без дебага. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:38 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевИногда ссылку на объект может опубликовать сам конструктор. Если это предок Вашего класса, то Ваше hb ему будет фиолетово.Все равно не понимаю, о чем речь. Можете набросать псевдокод? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:39 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 11:45 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38765759&tid=2126515]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
177ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 506ms |

| 0 / 0 |
