Thread1:
prevHead = head;
Thread2:
prevHead = head;
newHead = getFromFreeList();
if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);
Thread3:
prevHead = head;
newHead = getFromFreeList(); // Get the same object 'released' by Thread2
cas(&head, prevHead, newHead) // succeeds and put back what was removed by Thread2
Thread1:
newHead = getFromFreeList();
if (cas(&head, prevHead, newHead)) addToFreeList(prevHead);
// CAS will succeed although it shouldn't since there were
// a modification on the head done by 'Thread3' in between.
# 1 楼答案
在《多处理器编程的艺术》一书中,作者讨论了程序员可能希望在Java中实现自己的资源池(例如列表节点池)的情况。然后,直接管理池的程序员可以绕过垃圾收集,从而提高性能。尽管如此,必须谨慎避免ABA问题
以下是Java内存管理Java代码的核心:
LockFreeQueueRecycle的完整代码。java在这里可用:
http://booksite.elsevier.com/9780123705914/exercises/07~Chapter_10.zip
请参见第10章的幻灯片和代码:
http://booksite.elsevier.com/9780123705914/?ISBN=9780123705914
# 2 楼答案
自动垃圾收集如何防止ABA问题发生强> 请参阅Herlihy Shavit的“多处理器编程的艺术”。引用:It(ABA问题)经常出现,尤其是在动态内存算法中
当然,ABA问题可能出现在Java中,但由于在大多数情况下,问题出现在动态内存算法中,并且您不经常在Java中实现这种算法,所以您不会经常在Java中看到这种错误
在java中是否可能,如果可能,如何实现强> 《多处理器编程的艺术》一书用java给出了一个例子,说明了与无锁并发队列的内存回收相关的问题
有可能防止这种情况发生吗Quote:避免ABA,方法是测试两个时间点的值是否相同,但在这两个时间点之间的值是否发生过变化一种方法是使用AtomicStampedReference
# 3 楼答案
当启用自动垃圾回收时,不能使用同一引用分配两个对象并同时共存,这是因为只要引用计数大于0,引用本身就不会被释放和重新使用
因此,当有人仍然拥有旧的引用时,不能将不同对象的引用内容“切换”到“点”
# 4 楼答案
ABA问题与垃圾收集是正交的。例如,应用程序可以将对象从链接列表移动到自由列表,然后立即重新使用它们。因此,在重新使用之前,对象从未实际释放。 话虽如此,ABA问题可以通过以下方式发生: