在Java关键字中,volatile关键字有几个功能:1.体现出可见性;2.提现出不可重排性。
对于可见性的运用:
public class Service { //private boolean isContinueRun=true; private volatile boolean isContinueRun=true; //使用volatile体现出可见性 public void runMethod(){ while (isContinueRun==true){} System.out.println("停止下来"); } public void stopMethod(){ isContinueRun=false; } }
我们设置两个线程
public class ThreadA extends Thread { private Service service; public ThreadA(Service service) { this.service = service; } @Override public void run() { service.runMethod(); } }
public class ThreadB extends Thread { private Service service; public ThreadB(Service service) { this.service = service; } @Override public void run() { service.stopMethod(); } }
运行:
public class Main { public static void main(String[] args) throws InterruptedException { Service service=new Service(); ThreadA threadA=new ThreadA(service); threadA.start(); Thread.sleep(1000); ThreadB threadB=new ThreadB(service); threadB.start(); System.out.println("命令已经停止"); } }
在没有使用volatile关键字的时候,while循环在工作内存中运行,导致的结果就是死循环;使用了volatile关键字以后,while循环的改变在主内存中显示,当B线程启动时候,刷新主线程中的标志,导致while循环条件不符合而停止。这里还可以加锁。