原子布尔值,测试当前值

时间:2015-02-24 14:17:29

标签: java multithreading atomic atomicity

我在理解AtomicBoolean时遇到问题,我怎样才能最好地利用它的方法getAndSet(boolean newValue);

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

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

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

    public non-synchronized method() { 

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

           token = createNewToken()

 }

我知道有很多关于Atomic类的资源,但我还没有找到这样的例子,这可能表明我误用了AtomicBoolean。

1 个答案:

答案 0 :(得分:2)

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

更不用说你也访问了token变量,并且不清楚这是一个成员变量(可能是其他线程可以访问的)还是一个局部变量(不是)。 / p>