我用的是jdk1.8
程序的目的:
让一个新的线程去改变Numberss 实例的ss变量值,然后看main线程是否能得到新线程改变实例变量后的通知,从而看main线程中的Numberss 实例中的ss的值是否会被改变
class Numberss {
int ss = 1000;
public void changess() {
this.ss = 500;
}
}
public class T {
public static void main(String[] args) {
Numberss numberss = new Numberss();
new Thread(()->{
try {
Thread.sleep(3000);
numberss.changess();
System.out.println(Thread.currentThread().getName() +" 已经改变 : " + numberss.ss);
} catch (InterruptedException e) {
e.printStackTrace();
}
},"aa").start();
while (numberss.ss ==1000){
System.out.println(Thread.currentThread().getName() + " 等待-");
}
System.out.println(Thread.currentThread().getName()+" end");
System.out.println(Thread.currentThread().getName()+numberss.ss);
}
}
在线程aa中修改了Numberss 中的ss值且ss没有用volatile修饰,main线程竟然访问到了aa线程修改的ss的值。
突破了我对volatile的认知
总归会同步到内存的,时间问题,反而觉得访问不到才是突破认知吧
volatile提供了可见性,不代表不使用volatile就百分百不可见,只是不保证了而已