java - 通用的无锁同步

标签 java multithreading synchronization locking compare-and-swap

无锁数据结构的实现有时并不容易实现。以下方法可能看起来通用且简单,但我认为这里存在一些问题:

private AtomicBoolean lock = new AtomicBoolean(false);

    public void func(...) {
        while !lock.compareAndSet(false,true);
        // Some code goes here...
        ...
        ...
        ...
        lock.set(false); 
    }
}

我认为上面的代码并不是真正的“无锁”,因为它在忙等待模式下锁定了 while 循环中等待的线程。

因此,只有当“正确的”无锁同步不可能时,该代码才适用。

我的问题是 - 是否可以使用某种不同的方法实现通用无锁,并且它可以工作,这样线程就不会处于阻塞(如同步)或繁忙模式状态,并且代码将并行运行,因此我们可以提高性能?

我的目标是保持线程运行。我知道如果代码很长,最好使用同步机制而不是无锁实现,所以我们假设我们正在讨论短代码。

例如,下面是 Linkedlist 的示例,我认为这是一个很好的方法,但它对于常见数据结构来说并不通用。 如果我们在这里与 AtomicBoolean 一起使用,如上面所示,它不会真正“无锁”。

public class LinkedList<T> {

    private AtomicReference<Link<T>> head = new AtomicReference(null);

    public  void add(T data) {
      Link<T> localHead;
      Link<T> newHead = new Link<>(null, data);

      do {
        localHead = head.get();
        newHead.next = localHead;        
      } while (!head.compareAndSet(localHead, newHead));
    }
}

最佳答案

确实存在无锁甚至无等待算法的通用构造方案。例如:

但是,从理论角度来看,这些通常比实践角度更有趣。在实践中,专门的无锁算法通常比从这些通用结构派生的算法表现得更好。

如果您对无锁编程领域感兴趣,我建议您从这本书开始阅读 The Art of Multiprocessor Programming .

关于java - 通用的无锁同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108465/

相关文章:

Java - 迭代器 : "Syntax error, parameterized types are only available if source level is 5.0"

java - iReport 在 debian 上运行 java1.8

java - 如何通过改造调用处理来自网络的错误

multithreading - 为什么javafx应用程序不是线程安全的?

c - 使用互斥体的 Pthread 同步未正确同步单词

java - 如何使用 EMF 保存 View 零件

c# - 您如何通知父线程所有子线程都已终止?

java - 应用程序转换为 .jar 时 FileChooser 不工作

javascript - Google 如何在 Google Docs 中实现多用户编辑?

javascript - 如何将客户端网页计时器与服务器同步