当前位置: 首页 > 面试题库 >

AtomicInteger中的“比较并设置”如何工作

符允晨
2023-03-14
问题内容

AtomicInteger使用两个概念:CAS和volatile变量。

使用volatile变量可确保当前值对所有线程可见,并且不会被缓存。

但是我对以下解释的CAS(compare AND set)概念感到困惑:

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
 }

我的问题是什么if(compareAndSet(current, next)回报false?值不会更新吗?在这种情况下,当线程执行以下情况时会发生什么:

private AtomicInteger count = new AtomicInteger();
count.incrementAndGet();

问题答案:

原子对象利用Compare和Swap机制使它们成为原子-
即可以保证该值 指定的 ,并且现在 是新值。

您发布的代码不断尝试将当前值设置为比以前大一的值。请记住,另一个线程也可能执行了get并且正在尝试设置它。如果两个线程相互竞争以更改值,则增量之一可能会失败。

请考虑以下情形:

  1. 线程1调用get并获取值1
  2. 线程1计算next2
  3. 线程2调用get并获取值1
  4. 线程2计算next2
  5. 两个线程都尝试写入值。

现在,因为原子能的- 只有一个线程会成功 ,对方将收到false来自compareAndSet和再绕过去。

如果不使用此机制,则两个线程都很有可能增加该值,从而导致实际上仅执行一次增量。

for(;;)只有在许多线程同时写入变量的情况下,令人困惑的无限循环才会真正循环。在非常重的负载下,它可能会循环几次,但是应该很快完成。



 类似资料:
  • 在React的这篇文档中,据说 shallowCompare对current props和nextProps对象以及current state和nextState对象执行浅层相等性检查。 我无法理解的是,如果它简单地比较了对象,那么componentupdate方法应该总是返回true,就像 如果我们没有改变状态,那么比较将始终返回false,因此shouldComponent更新将始终返回tru

  • 我指的是这个博客上列出的代码:https://strstr.io/Leetcode1054-Distant-Barcodes/ 我在这里复制这段代码 我试图理解的代码在这里 我从这段代码中得到的是是用

  • 问题内容: 我一直在阅读编程书,作者展示了一个类似的示例: 所以,我想知道为什么为什么等于假?如何比较这两个元组? 顺便说一句,这本书没有解释。 问题答案: 比较元组的位置:将第一元组的第一项与第二元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较的结果,否则将考虑第二个,然后是第三个,依此类推。 请参阅常见序列操作: 相同类型的序列也支持比较。特别是,通过比较相应的元素

  • 问题内容: 用于比较的Python文档说: 可以任意链接比较,例如与等效,不同之处在于比较仅被评估一次(但在两种情况下都被发现为假,则根本不评估)。 所以像(人为的例子): 只要求输入一次。这很有道理。和这个: 仅询问 是否 介于1和10之间,并且仅打印“ woo!”。 if 也在10到20之间(证明它们可以“任意链接”)。这也是有道理的。 但是我仍然很好奇在lexer / parser / co

  • 如何在Eclipse上签出和设置EMF比较?我找到了EMF Compare的网站贡献者指南:http://wiki.eclipse.org/emf_compare/contributor_guide 但他们没有足够的指示。我查看了master branch,git存储库中没有包含大量其他依赖项。例如番石榴、纸莎草和UML2。 我正在寻找对EMF进行调整比较,我需要在Eclipse上设置它,这样我就