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