volatile关键字 作用 是使变量在多个线程间可见
在java 中 ,每一个线程都会有一个工作区内存,其中存放着线程共享的主内存中的变量值的一个拷贝,当线程执行时 在自己的工作区中操作这些变量,为了存取一个共享的变量,一个线程通常先获取锁定并去清除它的内存工作区,把这些共享变量从所有线程的共享内存区中正确的装入到自己所有的工作区,当线程解锁时保证该工作区中变量的值写回到共享内存中。
一个线程 可以执行的操作有 使用 赋值(assign) 装载(load) 存储(store) 锁定(lock) 解锁(unlock)\
而主存可以执行的操作有读(read) 写(write) 锁定(lock) 解锁(unlock) 每一个操作都是原子的
volatile的作用就是强制线程到主内存(共享内存) 里去读取变量,而不去线程工作区里读取,从而实现了多个线程间的变量可见,从而满足线程安全的可见性
下面这段代码很有迷惑性
public class RunThread extends Thread{
private boolean isRunning = true;
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
@Override
public void run() {
System.out.println(" run method ..");
while (isRunning) {
}
System.out.println(" run method end ");
}
public static void main(String[] args) {
RunThread rThread = new RunThread();
rThread.start();
try {
Thread.sleep(3000);
rThread.setRunning(false);
System.out.println(" isRunning 值已经被修改");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
之所以没有按照预想的执行 就是因为 变量拷贝到 线程自己的工作区内 而setRunning 方法 只把false 写放到了 主内存中 而线程自身工作内的 值仍为true
isRunning 变量 如果被 volatile修饰,则当变量值改变时 强制线程执行引擎去主内存里读取