Java 挥发性布尔值与AtomicBoolean
可变布尔不能实现的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; }
如果你正在运行一个线程·而另一个线程正在调用·,则如果你忽略它·,则可能会陷入无限循环,因为第一个线程可能会缓存·的值。在这里,这·暗示了编译器在优化时要更加谨慎。
以上是 Java 挥发性布尔值与AtomicBoolean 的全部内容, 来源链接: utcz.com/qa/419286.html