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,无法停掉。
浙公网安备 33010602011771号