当前位置: 首页 > 知识库问答 >
问题:

原子布尔值,电流值测试

莫选
2023-03-14

我有问题的理解原子布尔和我如何能最好地利用它的方法getAndSet(布尔值);

Volatile直接在内存中进行所有更改,所以如果CPU无法缓存某些值,那么线程之间的更改可见性是有保证的。同步保护不受比赛条件的影响。

以下代码是线程安全的吗?原子逻辑。get应该提供不稳定的保证,但是关于比赛条件呢?

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

    public non-synchronized method() { 

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

           token = createNewToken()

 }

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

共有1个答案

叶阳
2023-03-14

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

更不用说您还访问了标记变量,并且不清楚这是一个成员变量(其他线程可能可以访问)还是一个局部变量(不是)。

 类似资料:
  • 但是这个代码不起作用。编译器说 我在试图理解代码的问题是什么。我认为将返回一个布尔值流,我可以通过收集这些值。

  • 到目前为止我们看到的类型都能表示很大范围的数据,整数多的是,而浮点数更多。相对而言,字符集的规模小的多。C++中还有一个类型表示的范围更小,即布尔类型,它只能表示true和false两个值。 虽然没提到过该类型,但我们前面几章中实际已经使用过布尔值了。if语句和while语句中的条件就是布尔表达式。比较操作符的结果也是布尔值。例如: if (x == 5) { // 进行某些处理 } ==操

  • 原文: http://exploringjs.com/impatient-js/ch_booleans.html 基本类型 _ 布尔 _ 包含两个值 - false和true: > typeof false 'boolean' > typeof true 'boolean' 14.1。转换为布尔值 这三种方法可以将任意值x转换为布尔值。 Boolean(x) 最具描述性;推荐的。 x ?

  • 任何暗示都会很明显。

  • 问题内容: 哪种列类型最适合在MySQL数据库中使用布尔值?我用,但我的同事用。 问题答案: 这些数据类型是同义词。

  • 问题内容: 我根据另一个问题编写了一个非常简单的代码,它是: 丢给我一个错误 java.lang.NullPointerException第5和17行 我不知道我在做什么错。 问题答案: 无法自动拆箱为原始值,当您尝试与进行比较时会发生这种情况。在 类型为,因此左侧操作数也必须为。您正在传入,这是一个对象,但可以自动拆箱到。 因此,这相当于 显然,如果是,则以上抛出。 为了避免自动拆箱的隐藏陷阱,