有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无锁算法中的javaaba

我理解这个问题。但我无法理解的是:他们说,在具有自动垃圾收集功能的语言中,它可能不会表现出来。因此,我的问题是:

  • 自动垃圾收集如何防止ABA问题的发生
  • 在java中是否可能,如果可能,如何实现
  • 有可能防止这种情况发生吗

共 (4) 个答案

  1. # 1 楼答案

    在《多处理器编程的艺术》一书中,作者讨论了程序员可能希望在Java中实现自己的资源池(例如列表节点池)的情况。然后,直接管理池的程序员可以绕过垃圾收集,从而提高性能。尽管如此,必须谨慎避免ABA问题

    以下是Java内存管理Java代码的核心:

    ThreadLocal<Node> freeList = new ThreadLocal<Node>() {
        protected Node initialValue() { return null; };
    };
    

    LockFreeQueueRecycle的完整代码。java在这里可用:

    http://booksite.elsevier.com/9780123705914/exercises/07~Chapter_10.zip

    请参见第10章的幻灯片和代码:

    http://booksite.elsevier.com/9780123705914/?ISBN=9780123705914

  2. # 2 楼答案

    自动垃圾收集如何防止ABA问题发生 请参阅Herlihy Shavit的“多处理器编程的艺术”。引用:It(ABA问题)经常出现,尤其是在动态内存算法

    当然,ABA问题可能出现在Java中,但由于在大多数情况下,问题出现在动态内存算法中,并且您不经常在Java中实现这种算法,所以您不会经常在Java中看到这种错误

    在java中是否可能,如果可能,如何实现 《多处理器编程的艺术》一书用java给出了一个例子,说明了与无锁并发队列的内存回收相关的问题

    有可能防止这种情况发生吗Quote:避免ABA,方法是测试两个时间点的值是否相同,但在这两个时间点之间的值是否发生过变化一种方法是使用AtomicStampedReference

  3. # 3 楼答案

    • 当启用自动垃圾回收时,不能使用同一引用分配两个对象并同时共存,这是因为只要引用计数大于0,引用本身就不会被释放和重新使用

      因此,当有人仍然拥有旧的引用时,不能将不同对象的引用内容“切换”到“点”

  4. # 4 楼答案

    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.