powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem
38 сообщений из 38, показаны все 2 страниц
ABA problem
    #39420138
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже касались этой темы, но я до сих пор так и не понял многих моментов.

Вот что по этому поводу в concurrency in practice пишут:

автор 15.4.4. The ABA Problem
The ABA problem is an anomaly that can arise from the naive use of compareͲandͲswap in algorithms where nodes can
be recycled (primarily in environments without garbage collection). A CAS effectively asks "Is the value of V still A?", and
proceeds with the update if so. In most situations, including the examples presented in this chapter, this is entirely
sufficient. However, sometimes we really want to ask "Has the value of V changed since I last observed it to be A?" For
some algorithms, changing V from A to B and then back to A still counts as a change that requires us to retry some
algorithmic step.
This ABA problem can arise in algorithms that do their own memory management for link node objects. In this case, that
the head of a list still refers to a previously observed node is not enough to imply that the contents of the list have not
changed. If you cannot avoid the ABA problem by letting the garbage collector manage link nodes for you, there is still a
relatively simple solution: instead of updating the value of a reference, update a pair of values, a reference and a
version number. Even if the value changes from A to B and back to A, the version numbers will be different.
AtomicStampedReference (and its cousin AtomicMarkableReference) provide atomic conditional update on a pair of
variables. AtomicStampedReference updates an object referenceͲinteger pair, allowing "versioned" references that are
immune[8] to the ABA problem. Similarly, AtomicMarkableReference updates an object referenceͲboolean pair that is
used by some algorithms to let a node remain in a list while being marked as deleted.[9]
-------------
[8] In practice, anyway; theoretically the counter could wrap.
[9] Many processors provide a doubleͲwide CAS (CAS2 or CASX) operation that can operate on a pointerͲinteger pair, which would make this
operation reasonably efficient. As of Java 6, Atomic-StampedReference does not use doubleͲwide CAS even on platforms that support it.
(DoubleͲwide CAS differs from DCAS, which operates on two unrelated memory locations; as of this writing, no current processor implements
DCAS.)

Непонятно почему языки без автоматического управления памятью более узявимы.
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему
...
Рейтинг: 0 / 0
ABA problem
    #39420312
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA
- http://stackoverflow.com/a/19663933
...
Рейтинг: 0 / 0
ABA problem
    #39420940
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanquestionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA
- http://stackoverflow.com/a/19663933

авторWhen automatic garbage collection is enabled ,no two objects can be allocated with the same reference and co-exist at the same time,that's because as long as there is a reference count greater then 0 the reference itself will not be released and re-used.

Я не силён в С и мне не ясна эта фраза.

одна ссылка в С может указывать на два объекта?
...
Рейтинг: 0 / 0
ABA problem
    #39420963
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman https://ru.wikipedia.org/wiki/Проблема_ABA
После слов

"прочитано одинаковое значение, и признак «значение одинаковое» трактуется как «ничего не менялось». Однако, другой поток может выполниться между этими двумя чтениями, поменять значение, сделать что-нибудь ещё и восстановить старое значение"

читать перестал. Т.к. это называется ОШИБКА ПРОГРАММИСТА. И почему это называется "проблемой", лично мне не понятно.

Например тот же Hibernate, если хочется удостоверится, что "ничего не менялось" банально использует поле version. Прикладные системы (напрмер OeBS) могут использовать поля с автором и временем модификации. Стандартная задача, которая на планете решается по 100500 раз в день и ни для кого проблемой не является.

Называть грубую ошибку программиста "проблемой" и пинать на языки программирования... ну, б....ь, это IMHO уровень девочки-блондинки месяц назад окончивший институт.

questioner
авторWhen automatic garbage collection is enabled ,no two objects can be allocated with the same reference and co-exist at the same time,that's because as long as there is a reference count greater then 0 the reference itself will not be released and re-used.

Я не силён в С и мне не ясна эта фраза.

одна ссылка в С может указывать на два объекта?

So do I. В данном случае соглашусь с questioner

questionerодна ссылка в С может указывать на два объекта?

Если я правильно понял "проблему с" ABA, то разумеется. В случае, когда руки растут из ж.... Нет ничего не возможного.

Выделили один объект. Освободили память. Выделили второй. Объектов два и возможно разных, а ссылка на них одинаковая.

Но вот то, что того же самого при должен уровне "профессионализма" нельзя добиться в Java - лично для меня требует доказательств ))) Я привык доверять профессионализму своих коллег.
...
Рейтинг: 0 / 0
ABA problem
    #39420968
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerмне не ясна эта фраза.Речь о подсчете ссылок .questionerодна ссылка в С может указывать на два объекта?Нет.
...
Рейтинг: 0 / 0
ABA problem
    #39420972
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все мои высказывая прошу считать относящимися только к ссылки из русской Wiki )))
...
Рейтинг: 0 / 0
ABA problem
    #39420985
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Проблема на самом деле в следующем. Алгоритмы на атомиках выглядят примерно так:


авторwhile(true)
--remember state
--do some stuff
--if(change state if state is same atomic){
----break;
--}
}

Так вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации.


Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
...
Рейтинг: 0 / 0
ABA problem
    #39420987
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

а Вы можете целиком мысль выразить ?

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

в вики пример со стеком:
изначально в нём
авторA
B
C

делаем pop.

Чтобы это сделать надо поменять ссылку на головы на next.
Что делаем.

Запоминаем текущую голову(A)
запоминаем новую голову(B)

Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой.



Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме

авторA
B
C
->
авторB
C
->
авторC
->
авторA
C

А теперь наш CAS случается и получается полна хрень
->
авторB
C


Причем тут автоматическое управление памятью?

Ссылка на B держится, соответственно он не вычистится.
...
Рейтинг: 0 / 0
ABA problem
    #39421003
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner

Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью

Обьясняли, просто некто слушать не хочет.

http://stackoverflow.com/questions/19660737/aba-in-lock-free-algorithms
...
Рейтинг: 0 / 0
ABA problem
    #39421010
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
подозреваю, что НЕ при чем.

Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации.

Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают).

Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно.

Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет )))

Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца.

IMHO
...
Рейтинг: 0 / 0
ABA problem
    #39421014
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerUsman,

а Вы можете целиком мысль выразить ?

непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную:
выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете
запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:

наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE)
...
Рейтинг: 0 / 0
ABA problem
    #39421017
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanquestionerUsman,

а Вы можете целиком мысль выразить ?

непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную:
выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете
запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:

наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE)

Я привел пример, который будет некорректно работать в джаве.

Можете привести пример, который будет работать в джаве, но не будет работать в Си ?
...
Рейтинг: 0 / 0
ABA problem
    #39421022
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevquestionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
подозреваю, что НЕ при чем.

Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации.

Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают).

Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно.

Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет )))

Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца.

IMHO

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


Код: java
1.
2.
3.
synchronized (var) {
  var.version ++;
}



Проблемы лично я не вижу ))) Вроде примерно так это решает и Hibernate (один из вариантов).

questioner
Если говорить об оптимизации, конкретных алгоритмах и конкретных решениях, то IMHO:
1. можно запомнить решения, которое написано в книжке и принять как "данной". Только вопрос зачем? Это пригодиться при решении других задач?
2. начать с более простых алгоритмов (например Circle Ring Buffer крайне прост и понятен)

IMHO & AFAIK

3. с точки зрения "оптимальности" алгоритмы и код которые включены в Java, в ряде обсуждений в И-нет приходят к "не все так однозначно" ( C ) дочь офицера.

AFAIK
...
Рейтинг: 0 / 0
ABA problem
    #39421029
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerНе вот упорно не могу понять причем тут язык программирования

Leonid Kudryavtsevподозреваю, что НЕ при чем.

IMHO
questionerКонкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме.

у кого "проблема" ?
Подозреваю, у автора алгоритма проблемы нет и его код замечательно работает

questionerСтек считается нетронутым если голова не менялась. ....если просто условие кривое?

Это НЕ условие (условие это Техническое Задание: "реализовать стек")
Это одно из возможных Решений.

И оно НЕ кривое, т.к. подозреваю код работает и, наверное, более оптимально чем некоторые другие возможные решения.

IMHO & AFAIK

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

Как можно оценить решение не вникая в него?

Логика там более чем простая
...
Рейтинг: 0 / 0
ABA problem
    #39421074
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. легко )))
книжку явно написал "умный дядька", поэтому можно подозревать, что явных ошибок (настолько простых) у него нет
это не говорит о том, что у него нет более хитрых ошибок )))
2.
Дай ссылку на исходный код. Есть очень большое ощущение (даже не вникая и не видя кода), что описанная тобой ситуация в конкретном коде просто не возможна. И я (даже не видя код), подозреваю почему не возможна )))

Например java.util.concurrent.ConcurrentLinkedQueue не хранит пользовательские данные непосредственно. Он их хранит в объекте Node. Если они были извлечен из коллекции, то снова там оказаться банально не могут. По определению. Т.к. вторая строка в коде метода помещения данных

Код: sql
1.
2.
3.
4.
public boolean  offer(E e) {
        if (e == null) throw new NullPointerException();
        Node<E> n = new Node<E>(e, null);
...



Ну и я так понимаю, еще один "финт ушами", что вместо вызова old_val.equel( new_value ) достаточно просто сравнить указатели.


questionerquestioner,

в вики пример со стеком:
изначально в нём
авторA
B
C


делаем pop.

Чтобы это сделать надо поменять ссылку на головы на next.
Что делаем.

Запоминаем текущую голову(A)
запоминаем новую голову(B)

Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой.


Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме

авторA
B
C
->
авторB
C
->
авторC
->
авторA
C

А теперь наш CAS случается и получается полна хрень
->
авторB
C


Причем тут автоматическое управление памятью?

Ссылка на B держится, соответственно он не вычистится.
...
Рейтинг: 0 / 0
ABA problem
    #39421110
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигню наверное написал.

Статью из Wiki я вообще не понимаю, приводить не работающий код и на примере не работающего кода что-то объяснять - это за гранью добра и зла.

Cкачал первоисточник "concurrency in practice", пошел читать
...
Рейтинг: 0 / 0
ABA problem
    #39421121
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO Статья из Wiki /особенно руской/ это вынос мозга. За гранью добра и зла.

И так многозадачность вынос мозга, еще и они стараются

Складывается четкое убеждение, что кроме Doug Lea и еще одного человека, на этой планете вообще никто серьезно concurrent не занимается ))) Что в Java в коллекциях его код, что книжки под его авторством, что в C то же он. Подозреваю, он ABA проблему придумал, он же и варианты решения предложил.

В общем-то, с ABA все понятно (кроме того, зачем это все так громко называть и тем более, зачем изучать ошибочный код):

1)
Обращаться по указателю, если мы не гарантируем, что он эксклюзивно наш, выглядит как минимум грязно (его мог кто-то удалить)

В Java и .NET это относительно безопасно.

2)
Память реюзится.

Т.ч. последовательность delete и new следующие друг за другом, могут привести к тому, что разные объекты могут занять одну и ту же область памяти. Что может привести к описанным сценарию. Если кодировать с ошибками.

В Java этого нет

Но зачем нужно кодировать с ошибками, тема не раскрыта.
...
Рейтинг: 0 / 0
ABA problem
    #39421129
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему


IMHO

Нет. В java данной проблемы имени Dog Lea нет. По определению. (т.к. Dog Lea похоже сам же ее и изобрел и сам же решил)

Но.... зато есть другая... О которой Dog Lea скромно говорить не стал. Его lock free алгоритм коллекции Concurrent Linked List, при некоторых патернах использования просто убивает Minor Garbage Collector как класс

В его алгоритме, мы не зачищаем Node.

Как я понимаю, мы этого корректно сделать и не можем, т.к. нагло обращаемся к их полям из других потоков не заботясь о синхронизации. (см. пред. сообщение, проблема N1 )

Т.е., мы можем с легкостью уйти от изобретенного им же ABA проблемы с помощь "letting the garbage collector manage link nodes for you" и бросая Node грязные. Но разумеется, в жизни когда все хорошо, это значит что где-то скрыта подлянка. Но об этой он не пишет. Ограничиваясь словами "If you cannot avoid ... letting..." ))) IMHO. Полный редиска
...
Рейтинг: 0 / 0
ABA problem
    #39421131
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам не проверял. Сейчас выпью чаю и тест для ConcurrentLinkedQueue запущу.
...
Рейтинг: 0 / 0
ABA problem
    #39421133
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В обычных коллекциях, например java.util.LinkedList

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  private E  remove(Entry<E> e) {
        if (e == header)
            throw new NoSuchElementException();
        E result = e.element;
        e.previous.next = e.next;
        e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
        size--;
        modCount++;
        return result;
    }



После удаления, элемент специально зачищается, что бы нельзя было мусором убить Minor Garbage Collector. В коллекциях lock free от Dog Lea этого нет.

Как страшно жить.

Зачем questioner Вы это сделали ((( Ну знал я, что по слухам в ConcurrentLinkedQueue есть проблемы из за которых от нее AKKA отказывается. Но деталей то я не знал. Что мне теперь с этими знаниями делать? Ты думаешь у меня печалей в жизни мало?
...
Рейтинг: 0 / 0
ABA problem
    #39421152
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустил тест. Да, мусор из Eden прорывается, т.е. проблема есть.

Но в JConsole я даже не сразу и заметил. На моем AMD, мусор в old перетекает крайне не быстро. Что, возможно объясняется тем, что класс Node очень маленький.

Но скачкообразно. Минут 5-10 график медленно полз, потом внезапно в Old сразу 2 метра мусора насыпалось. Ну и вообще график в JConsole какой-то странный, первый раз такое вижу.

Eden нормально "пилой", а old gen резкими прыжками, а servivour вообще не знаю как описать, прыжки но наоборот /от полного к пустому, в противофазе к old gen/.

Похоже, первый раз servivour накопил мусора на 2 Mb и выкинул в old gen, после чего вообще отключился ))) типа нафига мне работать, пускай все сразу в old gen уходит ))) что в принципе и правильно ))) нафиг servivour нужен )))

Занимательно одного. Первый раз вижу график в JConsole, когда servivour работает в режиме "прямотока"
...
Рейтинг: 0 / 0
ABA problem
    #39421340
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

По поводу исходного кода - его нет у меня.я взял из википедии идею и попытался её объяснить.

Но кстати в книге есть пример:

Код: 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.
@ThreadSafe
public class ConcurrentStack <E> {
    AtomicReference<Node<E>> top = new AtomicReference<Node<E>>();

    public void push(E item) {
        Node<E> newHead = new Node<E>(item);
        Node<E> oldHead;
        do {
            oldHead = top.get();
            newHead.next = oldHead;//вот тут ОС приостановила тред
        } while (!top.compareAndSet(oldHead, newHead));
    }

    public E pop() { // выполнился два раза
        Node<E> oldHead;
        Node<E> newHead;
        do {
            oldHead = top.get();
            if (oldHead == null)
                return null;
            newHead = oldHead.next;
        } while (!top.compareAndSet(oldHead, newHead));
        return oldHead.item;
    }

    private static class Node <E> {
        public final E item;
        public Node<E> next;

        public Node(E item) {
            this.item = item;
        }
    }
}
...
Рейтинг: 0 / 0
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
38 сообщений из 38, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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