Volatile关键字可见性
Java中volatile关键字用来修饰需要在多个线程之间保证修改可见性,但它不仅仅只用来保证被volatile修饰的变量,也可以保证同类实例中其他变量的可见性。
class MyTest{
static class MyClass{
public int years;
private int months;
private volatile int days;
public void update(){
years++;
days++;
months++;
}
@Override
public String toString() {
return "MyClass{" +
"years=" + years +
", months=" + months +
", days=" + days +
'}';
}
}
public static void main(String[] args) throws InterruptedException {
MyClass myClazz = new MyClass();
new Thread(()->{
myClazz.update();
}).start();
while(myClazz.years==0){ }
System.out.println(myClazz);
}
//运行结果:
//MyClass{years=1, months=1, days=1}
}
从结果可以看出来,Mian线程知道了myClazz实例的volatile变量被修改了,并且days、months这些非volatile变量的修改也被发现了。