我在理解AtomicBoolean时遇到问题,如何充分利用其方法getAndSet(boolean newValue);

易失性直接在内存中进行所有更改,因此,如果CPU无法缓存某些值,则可以保证线程之间更改的可见性。
同步保护免受竞争条件的影响。

以下代码线程安全吗? AtomicBoolean.get应该提供易变的保证,但是竞争条件呢?

private static AtomicBoolean tokenValid = new AtomicBoolean(false);
   //....

    public non-synchronized method() {

    if (token == null || tokenValid.getAndSet(tokenValid.get()) == false)

           token = createNewToken()

 }


我了解关于Atomic类的资源很多,但是我还没有找到这样的示例,这可能表明我在滥用AtomicBoolean。

最佳答案

否。您的代码不是线程安全的。 AtomicBoolean方法本身是线程安全的,可以避免争用条件,但是在调用这些方法之间,仍然可以有其他线程访问该对象。在您的情况下,首先调用tokenValid.get(),然后调用tokenValid.getAndSet(boolean)。在这两个调用之间,其他线程可能会调用tokenValid的方法之一。

更不用说您还访问token变量,并且不清楚它是成员变量(其他线程可能可以访问)还是局部变量(不是)。

08-18 03:13