当我们只对变量执行读取操作时,应该使用 Volatile,因为一个线程更新的值将对另一个线程可见,即使前一个线程失去 CPU 并退出同步块。那是对的吗?当需要使用原子行为时,将使用原子原语。例如 -
if (volatileBoolean) {
volatileBoolean = !volatileBoolean;
}
让我们假设 volatileBoolean 的值为 true。一个线程检查 volatileBoolean 为真并进入 if 块,第二个线程看到 volatileBoolean 的值为真,也进入 if 块。现在,让我们假设第一个线程将错误值(!volatileBoolean)分配给 volatileBoolean 变量并失去 CPU,因此退出 if 块。第二个线程将 volatileBoolean 视为 false,将其分配回 true。
这是应该使用 AtomicBoolean 的情况吗?如果是,为什么不能通过使用同步来处理?
synchronized(this){
if (volatileBoolean) {
volatileBoolean = !volatileBoolean;
}
}