在AtomicInteger.addAndGet(int)中使用无限循环 - java

在Java包中,java.util.concurrent.atomic AtomicInteger类具有方法addAndGet(int)

这是

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

为什么在这里使用无限循环来设置值?

参考方案

这是CAS loop的经典示例。比较设置是一个原子操作,它具有直接的硬件支持(通常在其后面有一些CPU指令)。仅当当前值等于预期值时,它原子地更新给定变量,如果一切成功,则返回true。通常,此循环仅执行一次。但是,在争用情况下(当其他线程尝试更新相同的值时),在通过get()读取当前值与通过compareAndSet更新它的另一个线程之间可能会设法更新它。在这种情况下,将重试整个过程,直到成功为止。

在这里使用无限循环只是样式问题。可以使用普通的do-while循环将其重写:

public final int addAndGet(int delta) {
    int current, next;
    do {
        current = get();
        next = current + delta;
    } while (!compareAndSet(current, next));
    return next;
}

Java中是否有一个函数可以像SUBSTRING函数一样工作,但可以用于整数? - java

java中有没有一个函数可以像SUBSTRING函数一样工作,但适用于整数。例如,用户输入为456789,我想将其分为两部分并将其放入不同的变量中。把它们分开例如,用户输入:456789前三个数字将在变量A中。最后3个数字将位于变量B中。通过= A / B;有人可以帮助我,我该怎么做,谢谢。 java参考方案 使用整数除法和模运算符:int input = …

是否有任何数据结构可以避免重复,保留顺序和随机访问 - java

以前,我正在寻找具有以下特征的数据结构。避免重复迭代顺序将与插入顺序相同在Java中,我使用LinkHashSet,在Python中,我使用OrderedDict现在,除了2个要求之外,我还有一个附加要求能够通过索引进行随机访问,这意味着我可以通过data[123]访问有没有可用的数据结构?还是我需要退回使用List? List可以完全满足第二和第三要求,但…

数组定义错误 - java

此代码有什么问题?if(a.length >= 2) int[] c = new int[]{a[0],a[1]}; return c; 它似乎一直认为上面代码的第二行是错误的,特别是int []语句(定义数组)。数组a已定义。 参考方案 变量c仅存在于if块的范围内。您可以立即使用return。if(a.length >= 2) return …

无法在Eclipse中调试条件中的最后一条语句? - java

public static void main(String args[]) { if(true) { int x= 3*44+7; //int y=1; } } 我将问题缩小为这个简单的语句,我真的不知道如何在Eclipse调试器中访问此变量。它总是在以下情况下发生:在if条件中声明变量,try-catch语句,循环等,并且偶然地是该块中的最后一个语句。为…

用Java覆盖 - java

有没有一种方法可以覆盖唯一更改为ArrayList的Java方法?例如:public void quickSortMethod(ArrayList<Integer> comparison, int start, int end) {} public void quickSortMethod(ArrayList<Double> comp…