volatile的可见性证明
class Mydata{
volatile int number = 0;
public void change(){
this.number=1;
}
}
public class Test {
public static void main(String[] args) {
Mydata mydata = new Mydata();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" come in !");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) { }
mydata.change();
System.out.println(Thread.currentThread().getName()+ " change over !");
System.out.println(Thread.currentThread().getName()+ " number value :"+mydata.number);
},"aaa").start();
while (mydata.number == 0){
}
System.out.println(Thread.currentThread().getName()+ " number value :"+mydata.number);
}
}
控制台输出结果:
aaa come in !
//等待三秒后
aaa change over !
aaa number value :1
main number value :1
分析:线程aaa修改资源类的number,由于volatile关键字修饰变量的可见性,main线程获知了这种改变,所以main线程的私有内存区域的number变成了线程aaa修改后的值,不执行while中的代码块,有了最后一行的输出。如果number变量不加volatile修饰,main线程对aaa线程对number的修改并不会获知,所以main线程会一直在循环while语句,没有最后一行的输出。