当前位置: 首页 > 面试题库 >

Java 挥发性布尔值与AtomicBoolean

汲利
2023-03-14
问题内容

可变布尔不能实现的AtomicBoolean有什么作用?


问题答案:

他们是完全不同的。考虑以下volatile整数示例:

volatile int i = 0;
void incIBy5() {
    i += 5;
}

如果两个线程同时调用该函数,则i之后可能为5,因为编译后的代码与此类似(除非你无法在上同步int):

void incIBy5() {
    int temp;
    synchronized(i) { temp = i }
    synchronized(i) { i = temp + 5 }
}

如果变量是易失性的,则对它的每个原子访问都是同步的,但是实际上什么才算是原子访问并不总是很明显。对于一个Atomic*对象,可以保证每种方法都是“原子的”。

因此,如果使用AtomicIntegerand getAndAdd(int delta),则可以确保结果为10。同样,如果两个线程同时对一个boolean变量取反,则使用a AtomicBoolean可以确保它之后具有原始值,而使用a可以确保volatile boolean没有。

因此,只要你有多个线程在修改字段,就需要使其成为原子的或使用显式同步。

的目的·是不同的。考虑这个例子

volatile boolean stop = false;
void loop() {
    while (!stop) { ... }
}
void stop() { stop = true; }

如果你正在运行一个线程·而另一个线程正在调用·,则如果你忽略它·,则可能会陷入无限循环,因为第一个线程可能会缓存·的值。在这里,这·暗示了编译器在优化时要更加谨慎。



 类似资料:
  • 问题内容: 我有一个缓存类,其中包含一个存储缓存项。 我很好奇更改为会带来什么后果? 我会提高性能吗?此缓存是只读缓存。 最佳选择是什么?只是HashMap?缓存将按一定间隔进行填充。 问题答案: 首先,您似乎不了解关键字的作用。它确保如果声明的变量保留的 引用值发生更改,则其他线程将看到它,而不是拥有缓存的副本。它与访问线程安全无关。 鉴于此,并且您说的是只读事实,您当然不需要使用任何提供线程安

  • 如何解释列表与NumPy数组上布尔运算和按位运算的行为差异? 我对

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

  • 问题内容: 在以下简单场景中: x是否需要挥发?我知道同步保证了原子性,但是我不确定可见性…是否执行锁->修改->解锁->锁保证,第二个锁之后x的值将为“新鲜”? 问题答案: 不,不是,已 同步 已在其后插入了内存屏障,因此考虑到其他线程将在同一锁上进行同步,所有线程将看到当前线程执行的更新。 就像同步的一样,易失性具有附加的内存屏障-根据CPU的不同,它是存储/加载/完全屏障,可确保一个线程的更

  • 到目前为止我们看到的类型都能表示很大范围的数据,整数多的是,而浮点数更多。相对而言,字符集的规模小的多。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 ?