powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem
13 сообщений из 38, страница 2 из 2
ABA problem
    #39421553
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 об этом вроде ни одним словом. (((
...
Рейтинг: 0 / 0
ABA problem
    #39421573
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Offtopic: Как на сайт опубликовать картинку с локального диска ?
...
Рейтинг: 0 / 0
ABA problem
    #39421626
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ABA problem
    #39421654
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За что купил, за то и продаю.

http://psy-lob-saw.blogspot.ru/2016/03/gc-nepotism-and-linked-queues.html

Но на графике от JConsole я вижу не то, что хотел бы. Сильно не уверен, что виной коллекция (((
...
Рейтинг: 0 / 0
ABA problem
    #39421823
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevIMHO Я уже кусок из книги прочитал.

В данном коде, не может быть ситуации "Поток 2 добавляет A обратно на стек".
Так как в данном коде НЕТ никакой возможности извлечь Node из стека и потом тот же Node положить обратно. Т.к. Node каждый раз создается разным


Уупс, да
...
Рейтинг: 0 / 0
ABA problem
    #39421830
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код от psy-lob-saw однозначно содержит данный эффект. Через JConsole это видно не однозначно, но если добавить банальный подсчет кол-во выделенной памяти и кол-во освобожденной (добавив метод finalize() ), то хорошо видно, minor GC объекты Node чистить отказывается.

На графиках от JConsole можно увидеть все, что хочешь ((( Это как чернильную кляксу рассматривать или на кофейной гуще гадать (((

Плюс видны утечки памяти, которые вообще с коллекциями не связаны. Возможно проистекают от работы JConsole. На моем компе где-то под 10 Mb в oldGen забивается.

На реализации ConcurrentLinkedQueue от JDK 1.8.65 лично я эффект не наблюдаю. Или просто его не заметил. Или в JDK 1.8 исправили.

В общем, х.з.
...
Рейтинг: 0 / 0
ABA problem
    #39422138
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questionerLeonid KudryavtsevIMHO Я уже кусок из книги прочитал.

В данном коде, не может быть ситуации "Поток 2 добавляет A обратно на стек".
Так как в данном коде НЕТ никакой возможности извлечь Node из стека и потом тот же Node положить обратно. Т.к. Node каждый раз создается разным


Уупс, да

Хотя если во время засыпания первый поток сначала добавит элемент, а потом удалит, то проблема таки будет
...
Рейтинг: 0 / 0
ABA problem
    #39422203
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aba проблемы( в такой постановке) в java быть не может, так как в промежутке времени когда мы берём значение и выполняемых CAs с ним, GC не может его собрать и никакой другой поток не может создать другой объект с таким же адресом. Наличие stampede reference в java api никак не связано с aba, достаточно зоглчнуть в тот же api и прочитать что там значение ссылки и метка оборачиваются в новый объект который и вставляется внутри в обычнейший atomic reference.
...
Рейтинг: 0 / 0
ABA problem
    #39422261
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНапример тот же Hibernate, если хочется удостоверится, что "ничего не менялось" банально использует поле version.В статье речь идет о чтении/записи в ячейку памяти.Leonid KudryavtsevИ почему это называется "проблемой", лично мне не понятно.Нет там никакой версионности. Т.к. Usmanдоступ к памяти неконтроллируемыйUsmanно при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:а может быть просто версионность (:
...
Рейтинг: 0 / 0
ABA problem
    #39422266
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892Aba проблемы( в такой постановке) в java быть не может, так как в промежутке времени когда мы берём значение и выполняемых CAs с ним, GC не может его собрать и никакой другой поток не может создать другой объект с таким же адресом. Наличие stampede reference в java api никак не связано с aba, достаточно зоглчнуть в тот же api и прочитать что там значение ссылки и метка оборачиваются в новый объект который и вставляется внутри в обычнейший atomic reference.
в такой это какой?

В варианте ABC-> BC-> C->AC (голова слева)

нет проблемы, это я согласен

Причина в том, что A будут разные будут в обоих случаях. Вернее обертка Node над А разная будет.

Но если будет такой сценарий:
ABC-> DABC->ABC


авторне может создать другой объект с таким же адресом.

Вот что это значит? на пальцах. Точнее как Си может создать объект с таким же адресом
...
Рейтинг: 0 / 0
ABA problem
    #39423644
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner...
Но если будет такой сценарий:
ABC-> DABC->ABC

Подозреваю "будет фиолетово". Т.е. работать алгоритму стека это не помещает (а для связанного списка, подозреваю, и такая ситуация не возможна).

questioner...
Точнее как Си может создать объект с таким же адресом
delete ptr;
ptr = new SomeType();

При некоторой доли везения (или невезения) адрес в ptr останется тот же самый, а объект будет другим.

IMHO
...
Рейтинг: 0 / 0
ABA problem
    #39423921
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
Подозреваю "будет фиолетово". Т.е. работать алгоритму стека это не помещает (а для связанного списка, подозреваю, и такая ситуация не возможна).


На чем основаны подозрения?

Leonid Kudryavtsevdelete ptr;
ptr = new SomeType();

При некоторой доли везения (или невезения) адрес в ptr останется тот же самый, а объект будет другим.



А в джаве всё то же самое, только без delete, всё ещё не понимаю в чем разница
...
Рейтинг: 0 / 0
ABA problem
    #39424309
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНа чем основаны подозрения?

Лениво такую ситуацию на листочке рассматривать.

questionerА в джаве всё то же самое, только без delete, всё ещё не понимаю в чем разница
Нет. Без delete такого не получится.
Нет delete - нет и проблемы (что в C, что в Java).
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]