volatile 主要用于修饰变量 如:volatile private boolean istrue=true;
在多线程环境中,每个线程会有自己的私有内存空间。而且在运行时,如果在jvm 的server服务模式下,线程会只读自己内存的数据。在此条件下,如果没有加入volatile修饰变量,即使变量值发生变化,线程也不会读取到(公共堆与线程私有堆数据不统一)。
如下实例:
线程代码;
public class ThreadC extends Thread{
private boolean isRunning=true;
public boolean isRuning(){
return isRunning;
}
public void setRunning (boolean isRunning){
this.isRunning=isRunning;
}
public void run (){
System.out.println("进入run了");
while(isRunning==true){
}
System.out.println("线程被停止了");
}
启动代码:
public static void main(String[] args) {
try {
ThreadC c=new ThreadC();
c.start();
Thread.sleep(1000);
c.setRunning(false);
System.out.println("已赋值");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
运行结果为:
可见程序在while处一直循环,并未跳出,虽然isRunning值已改变。但是只是公共堆中的值改变了。
如果加上volatile 修饰isRunning变量呢?
public class ThreadC extends Thread{
//****加入volatile修饰******
volatile private boolean isRunning=true;
public boolean isRuning(){
return isRunning;
}
public void setRunning (boolean isRunning){
this.isRunning=isRunning;
}
public void run (){
System.out.println("进入run了");
while(isRunning==true){
}
System.out.println("线程被停止了");
}
再次运行程序,结果如图:
可见线程停止了,程序跳出while死循环。说明线程的私有堆值被强制同步了。
我出身贫寒,从小就得到穷人三宝:每一餐饭都吃得下,每一晚都睡得着觉,每一天都笑得出来。----林清玄