Java 爪哇语;易挥发;类成员变量是否需要?
关于Java“volatile”关键字,我有一个问题: 假设我们有以下类: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; } } 现在,假设一个线程
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();