java中可见性有三种方式:
- volatile
- synchronized(开锁之前)
- final
这里介绍一下volatile。
public class VolatileThead extends Thread { private volatile boolean stop=false; public void stopMe(){ stop=true; } public void run(){ int i=0; while(!stop){ i++; } System.out.println("Thread Stop Success!"); } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { VolatileThead v = new VolatileThead(); v.start(); Thread.sleep(1000); v.stopMe(); Thread.sleep(1000); }}
上面代码运行》》》成功打印》》》Thread Stop Success!
但是去掉 volatile 关键字就会进去死循环!!!(代码第二行)
原因:
jvm中内存分为 主内存 和 工作内存(存放局部变量),一条线程执行时,会主内存先read共享变量,然后工作内存load共享变量,作为副本存放在工作内存中,工作内存修改副本,并没有修改主内存中的共享变量,需要使用volatile关键字提示同步修改,这样保证线程的可见性(就是一个线程修改变量,其他线程都立即知道)