Java多线程:Volatile关键字
程序员文章站
2022-05-05 16:36:08
...
看几个示例
public class Run {
public static void main(String[] args) {
RunThread thread = new RunThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
thread.setRunning(false);
System.out.println("已经赋值为false了");
}
}
public class RunThread extends Thread{
private boolean isRunning = true;
public String s="";
public Test test;
public void settest(Test test) {
this.test = test;
}
public boolean isRunning() {
return isRunning;
}
public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
public void sets(String s) {
this.s = s;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("进入Run");
while(isRunning) {
// System.out.println("ha");
// Test test = new Test();
}
System.out.println("线程停止了");
}
}
前提运行模式一定要为Server模式
运行结果:
可以看到,永远不会停止线程。为什么呢?
传说是这样的:
我们在一个线程中工作,要知道,都是在本地操作,也就是本地内存中操作,然而呢,我们要操作一个对象的数据,比如向上面那个例子,thread对象的isRunning数据,isRunning实际的数据是保存在主内存中,要和以前说过的本地虚拟机栈中的某个线程栈要区别开来。在上面代码执行过程中
这个循环中的isRunning判断似乎并没有读到Main线程更新到主内存中的IsRunning的新值,也就是这个线程读的还是之前副本的值,导致线程一直处于死循环状态。
仔细看这个图片哦,我弄了一个System.out.println(“ha”);
线程竟然停止了,好神奇啊!
还有更离谱的
我加上创建一个字符串线程也会停止,但是呢,如果加上一个创建数组的对象的却不可以了。
class test {
int x;
}
上一篇: 全班爆笑的趣事,食堂里也逗乐