当前位置:  开发笔记 > 编程语言 > 正文

避免.NET代码中的ABA问题

如何解决《避免.NET代码中的ABA问题》经验,为你挑选了1个好方法。

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

在他对无锁LIFO堆栈(2007年5月MSDN杂志中的CLR Inside Out专栏)的讨论中,Joe Duffy说:

"我们为每个推送产生一个对象分配,使我们不必担心所谓的ABA问题."

然后他继续简要地描述了ABA问题并提到这可能发生在本机C/C++中,因为内存分配器可以在释放后立即重用地址.

一切都很好.但是什么使.NET程序免受ABA问题的影响?他是否暗示因为节点不能立即重用(即节点超出范围和GC收集节点之间存在一些延迟),ABA问题不可能发生?如果是这样,这是一个安全的断言吗?

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



1> Curt Hagenlo..:

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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有