请注意,我已经知道并了解ABA problem。这个问题是关于ABA的.NET内存模型的行为。

在对Lock-Free LIFO Stack(2007年5月MSDN杂志上的CLR Inside Out专栏)的讨论中,Joe Duffy说:

“我们为每个Push分配一个对象,从而使我们不必担心所谓的ABA问题。”

然后,他继续非常简短地描述ABA问题,并提到这可能在 native C/C++中发生,因为内存分配器可以在地址释放后立即重用它。

一切都很好。但是,什么使.NET程序不受ABA问题的影响呢?他是否暗示着由于节点无法立即重用(即,当节点超出范围和GC收集范围之间存在一定的延迟),就不可能发生ABA问题吗?如果是这样,那是一个安全的主张吗?

我将是第一个承认我不知道.NET内存分配器或垃圾收集器的所有复杂性的人,但是我的有限理解使我相信可以重用引用。并且,如果有可能可以重用引用,那么,即使确实不太可能,也不会使ABA问题成为可能吗?

最佳答案

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

10-08 01:18