java中volatile中的使用

java中可见性有三种方式:

  1. volatile
  2. synchronized(开锁之前)
  3. 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关键字提示同步修改,这样保证线程的可见性(就是一个线程修改变量,其他线程都立即知道)

posted @ 2018-03-26 16:35  火星移民专家  阅读(123)  评论(0编辑  收藏  举报