|
|
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ПОТОК 1 Код: java 1. 2. ПОТОК 2 Код: java 1. 2. 3. 4. 5. 6. Что может напечатать ПОТОК2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 23:34 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
ИМХО все 3 варианта, а что разве volatile спасает от race? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 00:57 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Хз, не отвечу. Понятно, что если бы не synchronized, то было бы [null, 0, 42]. В рассматриваем же примере, надо понять возможен ли 0. А это зависит от того, во что скомпилируется пустой synchronized-блок. Если JVM его выкосит целиком, то 0 возможен. Если же она выкосит саму логику монитора, но при этом оставит барьеры, а именно StoreLoad после выхода из synchronized, то 0 не будет. В общем, я бы включил PrintAssembly, дождался бы компиляции, и посмотрел на ассемблю С() и getA(). Если увидим там мониторную lock addl(esp, 0), значит 0 невозможен. В противном случае - возможен. Но я все же склоняюсь к тому, что ноль здесь невозможен, в противном случае это нарушает заветы JMM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 01:02 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Да, все нормально будет - без 0. Только что проверил на коде из своего тренинга, в котором вылетает NPE, если нет final. Вот сам код: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 01:23 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
[42, null] / [42, null, 0] Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:29 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
schwa[42, null] / [42, null, 0] Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:39 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjvschwa[42, null] / [42, null, 0] Результат зависит только от того, а выбрасывает ли JVM пустые synchronized-блоки.Нет, результат зависит от того, насколько корректно она их выбрасывает. Корректно. Нет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:41 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
А с чего бы вдруг уважающая себя JVM должна выкидывать инструкции являющиеся точками hb ? Это ж форменный беспредел ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:51 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Свеном ну твой пример это не доказательство А слабо на языке отношений доказать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:52 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
no56892ИМХО все 3 варианта, а что разве volatile спасает от race? Ну если мы записали в волатайл поле - то вскоре таки прочтем то что записали там же hb как никак между записью и чтением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 08:53 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
а если поток один записал в память 42, но lock еще не получил, в то время как 2й с локом читает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 09:11 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
schwaНет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER.Нет, результат зависит от того, нарушает ли JIT модель памяти при оптимизациях или нет. Я склонен думать, что не нарушает, достаточно выпилить саму логику монитора, но оставить барьеры по краям. Логика, сэр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:08 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01А с чего бы вдруг уважающая себя JVM должна выкидывать инструкции являющиеся точками hb ? Это ж форменный беспредел )))+1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:11 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Результат опроса пока радует)))) В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:23 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
schwaНет. Результат зависит от того, а запускается ли код на ai64, ARM-е или POWER. https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/opto/macro.cpp , строчка 1958. Шах и мат, schwa! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:32 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Результат опроса пока радует)))) В серьезные конторы где JSP и Struts это ругательства конкуренция не столь большая будет))))Ответственно заявляю вам - конкуренции практически нет. Так как нет и большого числа годных разработчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:38 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
no56892а если поток один записал в память 42, но lock еще не получил, в то время как 2й с локом читает?В это случае вы не увидите null в GLOBAL. Тут вопрос только в том, может ли присвоение 42 "убежать" за присвоение GLOBAL. Как показывает анализ исходников Hotspot - не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:41 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Свеном такие задачки решаются на языке математики и отношений В данном случае это SO , HB , PO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:54 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Свеном такие задачки решаются на языке математики и отношений В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:10 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjvbuldozer01Свеном такие задачки решаются на языке математики и отношений В данном случае это SO , HB , POЕсли вам нравится мозгодрочка - решайте. Мне это не надо, я вижу data race на автомате. В данном случае все кристально ясно - между выходом из C() и входом в getA() есть HB. Вопрос был только в том, не исчезнет ли это HB при выпиливании пустых критических секций. И, кажется, я дал достаточно убедительный ответ. Мозгодрочка ??? ))))))) Ну Ну Я думал ты серьезный программист а ты ж джедай точно))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:11 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Мозгодрочка ??? ))))))) Ну Ну Я думал ты серьезный программист а ты ж джедай точно)))Умножьте 8 на 9. Вы это как делаете - столбиком, или "на автомате". А эотт кмомнетаирй пеерчтиайте еще раз. Вы как это сделали - по слогам, или "на автомате"? Когда у тебя за спиной много тысяч строк конкурентного кода, тебе не нужны никакие SO и PO. Максимум - HB. А про эти абстрактные вещи имеет смысл рассуждать либо в рамках образовательного процесса, либо в рамках мозгодрочки в concurrency-interest. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:16 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Программисты делятся на несколько групп 1) Джедаи 2) Евангелисты 3) Тупо сидим курим, формочки клипаем и снимает ЗП с карточки 4) Серьезные академически грамотные разработчики Ты видимо из первых - я стараюсь двигаться к четвертым ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:19 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Какой мат, уважаемый? Никто не пытался тебе ничего доказывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:47 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
schwaКакой мат, уважаемый? Никто не пытался тебе ничего доказывать.Все верно. Доказывали не вы, доказывали вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:53 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Программисты делятся на несколько групп 1) Джедаи 2) Евангелисты 3) Тупо сидим курим, формочки клипаем и снимает ЗП с карточки 4) Серьезные академически грамотные разработчики Ты видимо из первых - я стараюсь двигаться к четвертымКакодемонов еще забыли. Мне побоку на эти группы, я не принадлежу ни к одной из них. Я разработчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 11:54 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Ну тогда не удивляйся что тебя не воспринимают как эксперта и тролят всем форумом Сейчас в этом диалоге со мной ты явно демонстрируешь свою проф незрелость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:04 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01, вот расскажите пожалуйста, были ли вам полезны знания тонкостей JMM (не общие принципы многопоточной работы, типа synchronized, wait, notify, ReentrantLock), а именно тонкости, типа Happens Before в разных явно не синхронизированных операциях? Как мне кажется, это все реально нужно только в очень узкоспециализированных задачах, или чтобы разбираться в говнокоде (или писать говнокод). А исходный пример, в реальности модифицируется вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. И никаких вопросов больше не возникает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:10 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Ну тогда не удивляйся что тебя не воспринимают как эксперта и тролят всем форумом Сейчас в этом диалоге со мной ты явно демонстрируешь свою проф незрелостьКоллега, я не имею и никогда не имел своей целью демонстрировать свою проф пригодность на этом форуме. Я демонстрирую ее только в одном месте - на работе. Здесь же я либо помогаю новичкам, либо улучшаю свое настроение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:11 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
HoBTID, Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду Каждый syncrhonized блок на счету Каждый CAS чего то стоит Нет там где клипают джиспишки это конечно неособо важно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:12 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Окей Окей )))) Ни в коему случае не хочу Вас в чем то переубеждать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:13 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
HoBTIDbuldozer01, вот расскажите пожалуйста, были ли вам полезны знания тонкостей JMM (не общие принципы многопоточной работы, типа synchronized, wait, notify, ReentrantLock), а именно тонкости, типа Happens Before в разных явно не синхронизированных операциях? Как мне кажется, это все реально нужно только в очень узкоспециализированных задачах, или чтобы разбираться в говнокоде (или писать говнокод).Так и есть, только в узкоспециализированных задачах. Но дело в том, что такие задачи в России есть как минимум в Москве и Питере, за их решение очень недурно платят, и устроиться в соответствующую контору абсолютно реально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:13 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01, А кто такие эти джедаи? По остальным группам вопрос нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:13 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01HoBTID, Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду Каждый syncrhonized блок на счету Каждый CAS чего то стоитЕсли приведенный вами код не из головы, а из какой-то реальной задачи, то я не понимаю, почему вы не применили final или volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:15 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
HoBTIDА исходный пример, в реальности модифицируется вот так: Мы бы с вами после такой модификации кода не сработались Если бы Вы были лид и упорно бы перли что синхронайздед блок нужно оставить - вы бы перестали быть для меня авторитетом как профи и я бы уволился чуть позже. Если бы я был лид - вы либо переучивались бы либо я бы вас уволил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:15 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Нет там где клипают джиспишки это конечно неособо важно Чёрт, у нас не JSP, поновее шаблонизатор выбрали :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:16 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjvbuldozer01HoBTID, Да мне это было нужно когда я пытался разогнать приложение - чтоб оно пропускало 300.000 запросов в секунду Каждый syncrhonized блок на счету Каждый CAS чего то стоитЕсли приведенный вами код не из головы, а из какой-то реальной задачи, то я не понимаю, почему вы не применили final или volatile. Нет код в задачке не из реальной жизни Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:17 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Нет там где клипают джиспишки это конечно неособо важно Это какой-то новый тип ЧСВ? Highload ЧСВ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:18 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Blazkowiczbuldozer01Нет там где клипают джиспишки это конечно неособо важно Это какой-то новый тип ЧСВ? Highload ЧСВ! Да какое к черту ЧСВ)))) Так вот решил пообщаться с коллегами а вместо этого меня пытаются убедить что говнкодинг это круто и мощно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:19 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
schwabuldozer01, А кто такие эти джедаи? По остальным группам вопрос нет. Да щас они везде требуются))) уяк уяк и в продакшен видимо ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:22 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Нет код в задачке не из реальной жизни Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответаА понятно. Вы их портреты уже заказали себе домой на стену? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:44 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭто какой-то новый тип ЧСВ? Highload ЧСВ! Причем у обоих, и они встретились, при этом, у них самое большое количество постов в разделе Работа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:46 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
0FDBlazkowiczЭто какой-то новый тип ЧСВ? Highload ЧСВ! Причем у обоих, и они встретились, при этом, у них самое большое количество постов в разделе Работа. Ну к сожалению в форуме Java как мы видим не нашлось людей которые бы академически грамотно обосновали свой ответ Вот и юзаем сруль по назначению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:48 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjvbuldozer01Нет код в задачке не из реальной жизни Задачка взята с concurrency-interests - где действительно академически грамотные разработчики на языке HB, SO , PO дают доказательство правильного ответаА понятно. Вы их портреты уже заказали себе домой на стену? Нет я спокойно прочел и внял то что пишут умные люди Надеялся таких же встретить здесь ))) Но видать не судьба. Здесь в основном Джедаи и Тролли походу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 12:49 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
buldozer01Нет я спокойно прочел и внял то что пишут умные люди Надеялся таких же встретить здесь ))) Но видать не судьба. Здесь в основном Джедаи и Тролли походу)Понятно, юношеский максимализм. Прочитали про формальные основы JMM, и теперь считаете, что все, кто их не применяет их от и до в реальной жизни - УГ. А тем временем Даг Ли работает над новой спецификацией JMM, потому что в текущем виде со всеми этими PO и SO ... она действительно практически неприменима за рамками узкого коммьюнити, которое саму же JMM и разрабатывает. Когда набьете себе руку в конкаренси, когда все это у вас хорошо уляжется в голове, вы поймете, что в реальной жизни, какие бы сложные прикладные вещи вы не писали, это все нахрен никому не нужно. Все, что я использую из этой теории в практике - HB и freeze файнал полей. Остальное - заумствования которые могут быть нужны только на этапе обучения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 13:05 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
cdtyjvКогда набьете себе руку в конкаренси... До уровня Джедаев видимо никогда не набью ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 13:08 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
А задачка то и правда интересная. Там вопрос в том, можно ли сделать в качестве Synchronization Order сначала getA() а потом уже конструктор. PO этому помешать вроде как не может (он независимо от SO работает). HB - тоже. Остается только causality requirement. Вот не вижу я, где он может помешать закоммитить synchronization() в конструкторе после всего остального кода из примера. Так что и 0 можно увидеть при особом желании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 22:12 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
А, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 22:19 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
Первый сильный пост на 2 страницы говнофлуда ))) Спасибо Вам уважаемый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 22:41 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
maxkarА, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}. Да, там 0 не будет, но только не потому, что 2й поток не увидит 0, а потому, что у него просто не будет ссылки на объект в промежуток времени когда там еще будет 0. Я тож проглядел) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 23:04 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#18+
no56892maxkarА, блин, я что-то торможу. Нет там 0. Если SO у нас getA() -> ctor, то чтение из global не может увидеть запись туда значения в потоке 1. А если ctor -> getA(), то чтение не может увидеть 0. Поэтому ответ будет {null, 42}. Да, там 0 не будет, но только не потому, что 2й поток не увидит 0, а потому, что у него просто не будет ссылки на объект в промежуток времени когда там еще будет 0. Я тож проглядел) Так вроде бы если ссылка на объект "утекла" в конструкторе, то не гарантируется что другой поток увидит уже установленное значение 42? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 08:13 |
|
||
|
Задачка на ночь
|
|||
|---|---|---|---|
|
#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?all=1&fid=59&tid=2126515]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 461ms |

| 0 / 0 |
