Java 爪哇语;易挥发;类成员变量是否需要?

Java 爪哇语;易挥发;类成员变量是否需要?,java,volatile,Java,Volatile,关于Java“volatile”关键字,我有一个问题: 假设我们有以下类: public class BooleanValClass { private boolean bolVal = false; public boolean getVal() { return this.bolVal; } public void setVal(boolean val) { bolVal = val; } } 现在,假设一个线程

关于Java“volatile”关键字,我有一个问题:

假设我们有以下类:

public class BooleanValClass {

    private boolean bolVal = false;

    public boolean getVal() {
        return this.bolVal;
    }

    public void setVal(boolean val) {
        bolVal = val;
    }
}
现在,假设一个线程正在使用带有“volatile”关键字的此类:

我是否还必须将“volatile”关键字附加到类“BooleanValClass”的成员字段“bolVal”,或者对象引用的“volatile”是否某种程度上“重定向”到类“BooleanValClass”的所有成员

谢谢,
汤姆

没有任何东西被重定向
myClass
是易失性的,
bolVal
不是。
myClass
中的赋值和读取操作是不稳定的。分配/读取到/从
bolVal
不执行。

没有任何内容被重定向
myClass
是易失性的,
bolVal
不是。
myClass
中的赋值和读取操作是不稳定的。在Java中,除了long和double以外的所有类型的读写字段都是由JVM以原子方式进行的,如果该字段是用VOLATILE修饰符声明的,那么即使long和double也会以原子方式进行读写。原子保证,我们100%得到变量中的内容或变量中计算的内容,变量中也不能有任何中间结果。

在Java中,除long和double之外的所有类型的读写字段都是由JVM原子地发生的,如果字段是用VOLATILE修饰符声明的,即使是long和double也变成了原子读写。原子保证,我们100%得到变量中的内容,或者变量中将要计算的内容,变量中也不可能有任何中间结果。

如果
myClass
从未更改,那么它应该是
final
而不是
volatile
。在我看来,
myClass
bolVal
这两个类都是可变的,这听起来并不合理。正如一个注释:Java中还有一个
AtomicBoolean
类可以使用。如果
myClass
从未更改,它应该是
最终的
而不是
易失的
。在我看来,
myClass
bolVal
这两个类都是可变的并不合理。请注意:Java中还有一个
AtomicBoolean
类,可以直接使用。正确指出。这只能确保myClass引用的最新更改(即,如果指向其他实例)将可见。正确指向。这只能确保myClass引用的最新更改(即,如果指向其他实例)可见。
private volatile BooleanValClass myClass = new BooleanValClass();