Обратите внимание, что я уже знаю и понимаю проблему ABA . Этот вопрос касается поведения модели памяти .NET по отношению к ABA.
В своем обсуждении стека LIFO без блокировки (колонка CLR Inside Out от журнала MSDN в мае 2007 года) Джо Даффи говорит:
«Мы выполняем распределение объектов для каждого Push, избавляя нас от необходимости беспокоиться о так называемых проблемах ABA».
Затем он очень кратко описывает проблему ABA и упоминает, что это может произойти в нативном C / C ++, поскольку распределитель памяти может повторно использовать адрес, как только он освободится.
Все хорошо. Но что делает программы .NET невосприимчивыми к проблеме ABA? Подразумевает ли он, что, поскольку узлы не могут быть повторно использованы немедленно (т. Е. Существует некоторая задержка между тем, когда узел выходит из области видимости и когда GC собирает его), нет возможности возникновения проблемы ABA? Если так, то это безопасное утверждение?
Я буду первым, кто признает, что я не знаю всех тонкостей распределителя памяти .NET или сборщика мусора, но мое ограниченное понимание заставляет меня поверить, что ссылку можно использовать повторно. , И если есть вероятность повторного использования ссылки, то не делает ли это возможным проблему ABA, если даже весьма маловероятную?