首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个通用的无锁同步

一个通用的无锁同步
EN

Stack Overflow用户
提问于 2020-02-07 14:51:28
回答 1查看 119关注 0票数 1

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

代码语言:javascript
复制
private AtomicBoolean lock = new AtomicBoolean(false);

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

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

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

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

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

例如,下面是Linkedlist的例子,我认为这是一种很好的方法,但它不适用于常见的数据结构。如果我们在这里与AtomicBoolean一起使用,就不会是真正的“无锁”。

代码语言:javascript
复制
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));
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-09 21:55:40

对于无锁甚至无等待的算法,确实有通用的构造方案。例如:

然而,这些通常从理论的角度而不是实际的角度更有趣。在实践中,专门的无锁算法通常比从这些通用构造派生的算法性能更好。

如果你对无锁编程感兴趣,我建议你从The Art of Multiprocessor Programming这本书开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60108465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档