1.什么是可见性?
当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值
2.在保证可见性的过程中,线程之间的通信是什么机制?共享内存
3.描述下volatile保证可见性的过程
所有的变量都存放在主内存,需要时拷贝,修改完再存回主内存
4.验证volatile可见性
class source{
volatile int id=0;
public void set()
{
this.id=30;
}
}
public class Test {
public static void main(String[] args) {
source s=new source();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+",come in");
//这个时间就是为了保证其他进程读取了资源类的id
TimeUnit.SECONDS.sleep(1);
s.set();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start();
//两个线程,另一个是main线程
while(s.id==0) {}
System.out.println("最后的id值:"+s.id);
}
}
/*
如果不使用volatile,程序会陷入死循环(在while中死跑)
使用后,线程A会通知主线程,就可以跳出死循环
*/