volatile关键字

见了很多博文对该关键字的描述,写的云里雾里,不知所谓,本人以最简单明了的方式供大家参考,有不对的地方请指正。

                            大伙先看下这个图

                           

1.大家对synchronized应该比较熟悉,多线程并发操作同一个对象的成员变量会线程不安全,因为这个对象的内存空间是在堆内存,堆内存是所有线程共享的,即上图的主内存,栈空间是保存一些局部变量的,是线程私有的。所以一个A线程对synchronized修饰的代码块对成员变量的操作, 另一个B线程即等待,A锁释放后,B就可以看到  成员变量的变化。

2.final大家也应该比较熟悉,对一个成员变量修饰后,该值不可变,那么所有线程操作同一个对象看到的都是一个值。

3.那么问题来了,说了synchronized和final,究竟和volatile有什么关系?

每个线程都有自己的工作内存空间,即上图的本地内存,这个空间对应于寄存器内存,是对一些数据操作的存储地方。如果一个对象的成员变量用volatile修饰,那么一个线程改变他,领一个线程会立刻知道他改变后的值,但是不能替代锁。不加的话,会一定时间寄存器内存将值刷新到主内存,这样其他线程才可以再看到变化。

代码:

  

public class Go extends Thread {
  private volatile boolean stop = false;

  public void stopMe() {
    stop = true;
  }

  public void run() {
    int i = 0;
    while (!stop) {
      i++;
    }
  System.out.println("Stop thread");
  }

  public static void main(String args[]) throws InterruptedException {
    Go t = new Go();
    t.start();
    Thread.sleep(1000);
    t.stopMe();
    Thread.sleep(1000);
  }
}

主线程main,新起的线程t,操作同一个对象Go的成员变量stop,主线程执行stopMe(),立刻停掉线程的t;如果不加volatile,无法停掉。

 

posted on 2017-04-23 18:25  老曹123  阅读(100)  评论(0)    收藏  举报

导航