Java 在下面的代码中使用无限for循环的目的是什么

Java 在下面的代码中使用无限for循环的目的是什么,java,Java,有人能解释一下吗……这是java AtomicBoolean getAndSet方法的官方定义 public final boolean getAndSet(boolean newValue) { for (;;) { boolean current = get(); if (compareAndSet(current, newValue)) return current; }

有人能解释一下吗……这是java AtomicBoolean getAndSet方法的官方定义

public final boolean getAndSet(boolean newValue) {
        for (;;) {
            boolean current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }

显然,这不是一个无限循环。循环仅在主体内部具有其退出条件:

return current;

一般来说,这是乐观、无锁原子操作中使用的典型习惯用法。比较和交换(CAS)操作将重试,直到成功,并且只要没有来自另一个线程的争用,它就会成功。更准确地说,只要
get()
的返回值与
compareAndSet()
观察到的当前值匹配,就会满足退出条件。很难不满足这个条件,而且这种情况很少发生。

显然,这不是一个无限循环。循环仅在主体内部具有其退出条件:

return current;

一般来说,这是乐观、无锁原子操作中使用的典型习惯用法。比较和交换(CAS)操作将重试,直到成功,并且只要没有来自另一个线程的争用,它就会成功。更准确地说,只要
get()
的返回值与
compareAndSet()
观察到的当前值匹配,就会满足退出条件。很难不满足这个条件,而且这种情况很少发生。

显然,这不是一个无限循环。循环仅在主体内部具有其退出条件:

return current;

一般来说,这是乐观、无锁原子操作中使用的典型习惯用法。比较和交换(CAS)操作将重试,直到成功,并且只要没有来自另一个线程的争用,它就会成功。更准确地说,只要
get()
的返回值与
compareAndSet()
观察到的当前值匹配,就会满足退出条件。很难不满足这个条件,而且这种情况很少发生。

显然,这不是一个无限循环。循环仅在主体内部具有其退出条件:

return current;
一般来说,这是乐观、无锁原子操作中使用的典型习惯用法。比较和交换(CAS)操作将重试,直到成功,并且只要没有来自另一个线程的争用,它就会成功。更准确地说,只要
get()
的返回值与
compareAndSet()
观察到的当前值匹配,就会满足退出条件。很难不满足这种条件,而且这种情况很少发生。

在Java 8中,对进行了轻微的重组,使其更易于理解:

public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
        prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
}
如您所见,返回一个来自本机函数的布尔值的函数可能会失败。在这种情况下,只需重复该操作

根据

如果Java变量当前处于预期状态,则自动将其更新为x。 返回: 如果成功,则为true 如果在调用
get()
和中的某个点之间更改了
AtomicBoolean
的值,则函数将失败。通常情况下不应该是这样,但当它发生时,它会再次轮询当前值,并希望相同的事情不会重复。

在Java 8中,已稍微重新构造,使其更易于理解:

public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
        prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
}
如您所见,返回一个来自本机函数的布尔值的函数可能会失败。在这种情况下,只需重复该操作

根据

如果Java变量当前处于预期状态,则自动将其更新为x。 返回: 如果成功,则为true 如果在调用
get()
和中的某个点之间更改了
AtomicBoolean
的值,则函数将失败。通常情况下不应该是这样,但当它发生时,它会再次轮询当前值,并希望相同的事情不会重复。

在Java 8中,已稍微重新构造,使其更易于理解:

public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
        prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
}
如您所见,返回一个来自本机函数的布尔值的函数可能会失败。在这种情况下,只需重复该操作

根据

如果Java变量当前处于预期状态,则自动将其更新为x。 返回: 如果成功,则为true 如果在调用
get()
和中的某个点之间更改了
AtomicBoolean
的值,则函数将失败。通常情况下不应该是这样,但当它发生时,它会再次轮询当前值,并希望相同的事情不会重复。

在Java 8中,已稍微重新构造,使其更易于理解:

public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
        prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
}
如您所见,返回一个来自本机函数的布尔值的函数可能会失败。在这种情况下,只需重复该操作

根据

如果Java变量当前处于预期状态,则自动将其更新为x。 返回: 如果成功,则为true
如果在调用
get()
和中的某个点之间更改了
AtomicBoolean
的值,则函数将失败。通常情况不应该是这样,但当它发生时,它会再次轮询当前值,并希望相同的事情不会重复。

感谢您的回答。如果compareAndSet没有写入true,则prev和newValue(因为它是一个计数器或其值不重复的东西)将永远不会匹配。使用for循环是否有特定的原因?是否应该提出一些例外或其他退出策略?@bharat9848:我不这么认为,因为
compareAndSet
可能失败的最常见情况是数据竞争,在这种情况下,它在下一次迭代中工作的可能性相当高。因此,为了方便调用方,不抛出异常是有意义的。即使它会扔一个,你会怎么做?展示它?重试此操作?谢谢您的回答。如果compareAndSet没有写入true,则prev和newValue(因为它是一个计数器或其值不重复的对象)将永远不会匹配。有没有一个具体的原因让我们这么做