|
|
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Уже касались этой темы, но я до сих пор так и не понял многих моментов. Вот что по этому поводу в 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.) Непонятно почему языки без автоматического управления памятью более узявимы. Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 16:23 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA - http://stackoverflow.com/a/19663933 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:46 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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. Я не силён в С и мне не ясна эта фраза. одна ссылка в С может указывать на два объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 16:41 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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 - лично для меня требует доказательств ))) Я привык доверять профессионализму своих коллег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 16:58 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerмне не ясна эта фраза.Речь о подсчете ссылок .questionerодна ссылка в С может указывать на два объекта?Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:00 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Все мои высказывая прошу считать относящимися только к ссылки из русской Wiki ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:04 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Проблема на самом деле в следующем. Алгоритмы на атомиках выглядят примерно так: авторwhile(true) --remember state --do some stuff --if(change state if state is same atomic){ ----break; --} } Так вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации. Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:21 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Usman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:23 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questioner, в вики пример со стеком: изначально в нём авторA B C делаем pop. Чтобы это сделать надо поменять ссылку на головы на next. Что делаем. Запоминаем текущую голову(A) запоминаем новую голову(B) Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой. Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме авторA B C -> авторB C -> авторC -> авторA C А теперь наш CAS случается и получается полна хрень -> авторB C Причем тут автоматическое управление памятью? Ссылка на B держится, соответственно он не вычистится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:39 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questioner Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью Обьясняли, просто некто слушать не хочет. http://stackoverflow.com/questions/19660737/aba-in-lock-free-algorithms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:41 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью подозреваю, что НЕ при чем. Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации. Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают). Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно. Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет ))) Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:48 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerUsman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную: выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (: наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:56 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
UsmanquestionerUsman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную: выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (: наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE) Я привел пример, который будет некорректно работать в джаве. Можете привести пример, который будет работать в джаве, но не будет работать в Си ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:02 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevquestionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью подозреваю, что НЕ при чем. Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации. Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают). Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно. Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет ))) Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца. IMHO Конкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме. Стек считается нетронутым если голова не менялась. Не вот упорно не могу понять причем тут язык программирования если просто условие кривое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:08 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerТак вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации. Код: java 1. 2. 3. Проблемы лично я не вижу ))) Вроде примерно так это решает и Hibernate (один из вариантов). questioner Если говорить об оптимизации, конкретных алгоритмах и конкретных решениях, то IMHO: 1. можно запомнить решения, которое написано в книжке и принять как "данной". Только вопрос зачем? Это пригодиться при решении других задач? 2. начать с более простых алгоритмов (например Circle Ring Buffer крайне прост и понятен) IMHO & AFAIK 3. с точки зрения "оптимальности" алгоритмы и код которые включены в Java, в ряде обсуждений в И-нет приходят к "не все так однозначно" ( C ) дочь офицера. AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:18 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerНе вот упорно не могу понять причем тут язык программирования Leonid Kudryavtsevподозреваю, что НЕ при чем. IMHO questionerКонкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме. у кого "проблема" ? Подозреваю, у автора алгоритма проблемы нет и его код замечательно работает questionerСтек считается нетронутым если голова не менялась. ....если просто условие кривое? Это НЕ условие (условие это Техническое Задание: "реализовать стек") Это одно из возможных Решений. И оно НЕ кривое, т.к. подозреваю код работает и, наверное, более оптимально чем некоторые другие возможные решения. IMHO & AFAIK В алгоритм не вдумывался. Не интересно. На свете слишком много разных алгоритмов, а жизнь скоротечна. Я еще свою сортировку не дописал ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:29 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Как можно оценить решение не вникая в него? Логика там более чем простая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 19:49 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
1. легко ))) книжку явно написал "умный дядька", поэтому можно подозревать, что явных ошибок (настолько простых) у него нет это не говорит о том, что у него нет более хитрых ошибок ))) 2. Дай ссылку на исходный код. Есть очень большое ощущение (даже не вникая и не видя кода), что описанная тобой ситуация в конкретном коде просто не возможна. И я (даже не видя код), подозреваю почему не возможна ))) Например java.util.concurrent.ConcurrentLinkedQueue не хранит пользовательские данные непосредственно. Он их хранит в объекте Node. Если они были извлечен из коллекции, то снова там оказаться банально не могут. По определению. Т.к. вторая строка в коде метода помещения данных Код: sql 1. 2. 3. 4. Ну и я так понимаю, еще один "финт ушами", что вместо вызова 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 держится, соответственно он не вычистится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 20:48 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Фигню наверное написал. Статью из Wiki я вообще не понимаю, приводить не работающий код и на примере не работающего кода что-то объяснять - это за гранью добра и зла. Cкачал первоисточник "concurrency in practice", пошел читать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 01:20 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
IMHO Статья из Wiki /особенно руской/ это вынос мозга. За гранью добра и зла. И так многозадачность вынос мозга, еще и они стараются Складывается четкое убеждение, что кроме Doug Lea и еще одного человека, на этой планете вообще никто серьезно concurrent не занимается ))) Что в Java в коллекциях его код, что книжки под его авторством, что в C то же он. Подозреваю, он ABA проблему придумал, он же и варианты решения предложил. В общем-то, с ABA все понятно (кроме того, зачем это все так громко называть и тем более, зачем изучать ошибочный код): 1) Обращаться по указателю, если мы не гарантируем, что он эксклюзивно наш, выглядит как минимум грязно (его мог кто-то удалить) В Java и .NET это относительно безопасно. 2) Память реюзится. Т.ч. последовательность delete и new следующие друг за другом, могут привести к тому, что разные объекты могут занять одну и ту же область памяти. Что может привести к описанным сценарию. Если кодировать с ошибками. В Java этого нет Но зачем нужно кодировать с ошибками, тема не раскрыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 04:21 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему 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. Полный редиска ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 05:40 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Сам не проверял. Сейчас выпью чаю и тест для ConcurrentLinkedQueue запущу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 05:49 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
В обычных коллекциях, например java.util.LinkedList Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. После удаления, элемент специально зачищается, что бы нельзя было мусором убить Minor Garbage Collector. В коллекциях lock free от Dog Lea этого нет. Как страшно жить. Зачем questioner Вы это сделали ((( Ну знал я, что по слухам в ConcurrentLinkedQueue есть проблемы из за которых от нее AKKA отказывается. Но деталей то я не знал. Что мне теперь с этими знаниями делать? Ты думаешь у меня печалей в жизни мало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 06:14 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Запустил тест. Да, мусор из 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 работает в режиме "прямотока" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 07:42 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 11:39 |
|
||
|
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?all=1&fid=59&tid=2123048]: |
0ms |
get settings: |
12ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
106ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 482ms |

| 0 / 0 |
