原子布尔值,测试当前值
Atomic boolean, test for current value
我在理解 AtomicBoolean 以及如何最好地利用它的方法 getAndSet(boolean newValue); 时遇到问题
Volatile 直接在内存中进行所有更改,因此如果 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
变量,目前尚不清楚它是成员变量(其他线程可能可以访问)还是局部变量(不是) .
我在理解 AtomicBoolean 以及如何最好地利用它的方法 getAndSet(boolean newValue); 时遇到问题
Volatile 直接在内存中进行所有更改,因此如果 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
变量,目前尚不清楚它是成员变量(其他线程可能可以访问)还是局部变量(不是) .