【发布时间】:2015-02-24 14:17:29
【问题描述】:
我无法理解 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。
【问题讨论】:
-
当我们不知道您想要达到的目标时,很难说它是否安全。如果你只是想获取当前值,
tokenValid.get()有什么问题? -
我不认为代码是逻辑安全的。你想用它来达到什么目的?
-
如果我尝试执行 tokenValid.get 而其他一些线程尝试执行 set 会发生什么?我想做什么:如果不满足上述条件,请获取一些新令牌。如果满足条件并且我只想获得一次令牌,则可以同时测试一个以上的线程
-
什么是
token,你为什么要检查它是否是null?您是否了解并发问题是什么以及为什么getAndSet()应该防止它? -
此外,以“缓存刷新/无效”的简单术语来推理
volatile的语义不会让您正确了解 Java 内存模型。这些不是理解发生在概念的可行捷径。
标签: java multithreading atomic