|
|
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
IMHO Я уже кусок из книги прочитал. В данном коде, не может быть ситуации "Поток 2 добавляет A обратно на стек". Так как в данном коде НЕТ никакой возможности извлечь Node из стека и потом тот же Node положить обратно. Т.к. Node каждый раз создается разным Но в данном коде есть "два финта ушами" 1. Обращение к объекту, хотя мы не уверены, что этот объект нам принадлежит Вида "newHead = oldHead.next" /// а oldHead == top Для Java это безопасно, для C не очень ))) Т.к. в этот момент top доступен нескольких потокам и никто не может гарантировать, что другой поток в этот момент не освободит данный блок памяти. Как минимум для C это грязный код. IMHO В качестве "маловероятной жести" : например другой поток на C в этот момент извлек top из стека, освободил данный блок памяти, вернул его операционной системе, операционная система освободила всю страницу операционной памяти и заодно пометила ее как ни используемой и запрещенной для доступа. И первый поток, попытавшись обратиться к ней, получит ошибку GPF / доступ запрещен ))) Вероятность такого конечно крайне низка, тем приятнее такие ошибки отлаживать IMHO. Т.е. на Java так делать можно, на C, в общем случае, это не корректно. Вывод из этой проблемы, при попытке использования данного алгоритма на языках без автоматического управления памятью, достаточно сложно придумать код для корректного удаления памяти. А вот здесь внимание! Легкое передергивание! Да, на Java мы можем так делать и можем "не думать" об удалении объектов. Как написано в книжке "letting the garbage collector manage link nodes for you" Но хорошо ли это? И ответ на данный вопрос НЕТ. Даже в Java, лучше все же за собой мусор убирать. А особенно в долго живущих объектах приложения. И в других коллекциях его убирают. 2. Собственно исходный постулат, если "вершина не менялась, то коллекция не менялся" Постулат полностью правдив. Так как любой Node находящаяся в коллекцию по определению уникальна (она создается) и нет никакой возможно "извлечь ее и положить обратно" === Т.ч. данной придуманной проблемы в данном коде нет. Зато есть другая проблема! Объект Node не очищается. Если коллекция долго живущая, это может порождать связанный мусор! Т.е. достаточно одному объекты Node попасть в OldGen область память, как все остальные Node, с которыми работает коллекция, оказывается не возможно очистить через Minor Garbage Collector и пофиг, насколько они короткоживущие. Их от удаления защищает мусор лежащий в OldGen'е ! А вот об этой особенности алгоритма, я в книжке не прочел. Да и в JavaDoc об этом вроде ни одним словом. ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 14:40 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Offtopic: Как на сайт опубликовать картинку с локального диска ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 14:49 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
За что купил, за то и продаю. http://psy-lob-saw.blogspot.ru/2016/03/gc-nepotism-and-linked-queues.html Но на графике от JConsole я вижу не то, что хотел бы. Сильно не уверен, что виной коллекция ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:31 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevIMHO Я уже кусок из книги прочитал. В данном коде, не может быть ситуации "Поток 2 добавляет A обратно на стек". Так как в данном коде НЕТ никакой возможности извлечь Node из стека и потом тот же Node положить обратно. Т.к. Node каждый раз создается разным Уупс, да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 18:00 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Код от psy-lob-saw однозначно содержит данный эффект. Через JConsole это видно не однозначно, но если добавить банальный подсчет кол-во выделенной памяти и кол-во освобожденной (добавив метод finalize() ), то хорошо видно, minor GC объекты Node чистить отказывается. На графиках от JConsole можно увидеть все, что хочешь ((( Это как чернильную кляксу рассматривать или на кофейной гуще гадать ((( Плюс видны утечки памяти, которые вообще с коллекциями не связаны. Возможно проистекают от работы JConsole. На моем компе где-то под 10 Mb в oldGen забивается. На реализации ConcurrentLinkedQueue от JDK 1.8.65 лично я эффект не наблюдаю. Или просто его не заметил. Или в JDK 1.8 исправили. В общем, х.з. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 18:10 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerLeonid KudryavtsevIMHO Я уже кусок из книги прочитал. В данном коде, не может быть ситуации "Поток 2 добавляет A обратно на стек". Так как в данном коде НЕТ никакой возможности извлечь Node из стека и потом тот же Node положить обратно. Т.к. Node каждый раз создается разным Уупс, да Хотя если во время засыпания первый поток сначала добавит элемент, а потом удалит, то проблема таки будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:06 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Aba проблемы( в такой постановке) в java быть не может, так как в промежутке времени когда мы берём значение и выполняемых CAs с ним, GC не может его собрать и никакой другой поток не может создать другой объект с таким же адресом. Наличие stampede reference в java api никак не связано с aba, достаточно зоглчнуть в тот же api и прочитать что там значение ссылки и метка оборачиваются в новый объект который и вставляется внутри в обычнейший atomic reference. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 16:57 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНапример тот же Hibernate, если хочется удостоверится, что "ничего не менялось" банально использует поле version.В статье речь идет о чтении/записи в ячейку памяти.Leonid KudryavtsevИ почему это называется "проблемой", лично мне не понятно.Нет там никакой версионности. Т.к. Usmanдоступ к памяти неконтроллируемыйUsmanно при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:а может быть просто версионность (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 19:13 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
no56892Aba проблемы( в такой постановке) в java быть не может, так как в промежутке времени когда мы берём значение и выполняемых CAs с ним, GC не может его собрать и никакой другой поток не может создать другой объект с таким же адресом. Наличие stampede reference в java api никак не связано с aba, достаточно зоглчнуть в тот же api и прочитать что там значение ссылки и метка оборачиваются в новый объект который и вставляется внутри в обычнейший atomic reference. в такой это какой? В варианте ABC-> BC-> C->AC (голова слева) нет проблемы, это я согласен Причина в том, что A будут разные будут в обоих случаях. Вернее обертка Node над А разная будет. Но если будет такой сценарий: ABC-> DABC->ABC авторне может создать другой объект с таким же адресом. Вот что это значит? на пальцах. Точнее как Си может создать объект с таким же адресом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 19:33 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questioner... Но если будет такой сценарий: ABC-> DABC->ABC Подозреваю "будет фиолетово". Т.е. работать алгоритму стека это не помещает (а для связанного списка, подозреваю, и такая ситуация не возможна). questioner... Точнее как Си может создать объект с таким же адресом delete ptr; ptr = new SomeType(); При некоторой доли везения (или невезения) адрес в ptr останется тот же самый, а объект будет другим. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 22:42 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Подозреваю "будет фиолетово". Т.е. работать алгоритму стека это не помещает (а для связанного списка, подозреваю, и такая ситуация не возможна). На чем основаны подозрения? Leonid Kudryavtsevdelete ptr; ptr = new SomeType(); При некоторой доли везения (или невезения) адрес в ptr останется тот же самый, а объект будет другим. А в джаве всё то же самое, только без delete, всё ещё не понимаю в чем разница ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2017, 11:56 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerНа чем основаны подозрения? Лениво такую ситуацию на листочке рассматривать. questionerА в джаве всё то же самое, только без delete, всё ещё не понимаю в чем разница Нет. Без delete такого не получится. Нет delete - нет и проблемы (что в C, что в Java). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2017, 17:53 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39421573&tid=2123048]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
79ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 401ms |

| 0 / 0 |
