避免在.NET代码中出现ABA问题

9
请注意,我已经知道并理解了ABA问题。这个问题是关于.NET内存模型在处理ABA时的行为。
在他对无锁LIFO栈(来自2007年5月MSDN杂志的CLR Inside Out专栏)的讨论中,Joe Duffy说:
“我们为每个Push承担一个对象分配,这样就不必担心所谓的ABA问题。”
然后他简要地描述了ABA问题,并提到这可能会发生在本机C/C++中,因为内存分配器可以在释放后立即重用地址。
一切都很好。但是是什么使.NET程序免受ABA问题的影响?他是否意味着因为节点不能立即重用(即在节点超出范围和GC收集它之间有一些延迟),因此不存在ABA问题的可能性?如果是这样,那么这是否是一个安全的断言?
我首先承认我不知道所有.NET内存分配器或垃圾回收器的复杂性,但我的有限了解让我相信引用可以被重用。如果存在引用可被重用的可能性,那么如果确实高度不可能,岂不是这就可能导致ABA问题?
1个回答

7

如果线程1在内存地址X处有一个对象引用,那么根据定义,线程2所做的任何事情都不会导致另一个对象使用同一地址。该对象仍然存在,并且其地址直到没有对它的引用为止才会被重用。这保证了当交换操作返回我们期望的值时,ABA问题没有发生。


……摇头我知道了。谢谢你纠正我。由于某种原因,我完全忽略了我正在交换的项目是一个引用。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接