我理解 ABA 问题。但是我不明白的是:他们说在拥有自动垃圾回收的语言中,它可能不会出现。所以我的问题是:
- 自动垃圾回收如何防止ABA问题的发生?
- 在Java中是否可能发生ABA问题,如果可以,如何避免?
- 是否可以防止ABA问题的发生?
我理解 ABA 问题。但是我不明白的是:他们说在拥有自动垃圾回收的语言中,它可能不会出现。所以我的问题是:
当启用自动垃圾回收时,两个对象不能使用相同的引用同时存在,这是因为只要有一个引用计数大于0,该引用本身就不会被释放和重复使用。
因此,在某人仍持有旧引用时,您无法将引用内容“切换”为指向不同的对象。
ABA问题与垃圾回收无关。例如,应用程序可以将对象从链表移动到空闲列表,然后立即将其重新使用。因此,在重新使用之前,对象实际上从未被释放。 尽管如此,ABA问题可能会以以下方式发生:
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.
ThreadLocal<Node> freeList = new ThreadLocal<Node>() {
protected Node initialValue() { return null; };
};
http://booksite.elsevier.com/9780123705914/exercises/07~Chapter_10.zip
请查看第10章的幻灯片和代码:
http://booksite.elsevier.com/9780123705914/?ISBN=9780123705914