volatile保证可见性,什么是可见性?
程序:
让A线程修改number变量,在main线程用while一直循环,直到A线程修改,然后打印 “main线程结束” 结束程序。
public class VolatileTest {
public static void main(String[] args) {
MyTest myTest = new MyTest();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("进入A线程");
try {
//等3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//调用方法 赋值 60
myTest.addTo60();
System.out.println(Thread.currentThread().getName()+" : "+myTest.number);
}
},"A线程").start();
//如果读到A线程number为0,一直循环
while (myTest.number == 0){
}
System.out.println("main线程结束");
}
}
class MyTest{
int number = 0;
public void addTo60(){
this.number = 60;
}
}
控制台结果:
当A线程从主存拿到数据,然后再自己的工作内存中操作数据(修改为60),然后刷新到主存。
程序一直不结束,此处我们可以知道,main线程没有去主存拿新的数据,一直读不到 60,所以没有保证可见性。
在number变量前面加上volatile,再次来看效果
volatile保证可见性
这里给number变量加上volatile后,当A线程修改number之后,刷新到主存,main线程去主存拿到新的数据,然后停止。
什么是可见性?
通俗来讲,当一个线程修改共享数据,其它线程立刻接到修改的通知,修改后的数据对其它线程可见。