欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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模式
运行结果:
Java多线程:Volatile关键字
可以看到,永远不会停止线程。为什么呢?
传说是这样的:
Java多线程:Volatile关键字
我们在一个线程中工作,要知道,都是在本地操作,也就是本地内存中操作,然而呢,我们要操作一个对象的数据,比如向上面那个例子,thread对象的isRunning数据,isRunning实际的数据是保存在主内存中,要和以前说过的本地虚拟机栈中的某个线程栈要区别开来。在上面代码执行过程中
Java多线程:Volatile关键字
这个循环中的isRunning判断似乎并没有读到Main线程更新到主内存中的IsRunning的新值,也就是这个线程读的还是之前副本的值,导致线程一直处于死循环状态。
仔细看这个图片哦,我弄了一个System.out.println(“ha”);
Java多线程:Volatile关键字
线程竟然停止了,好神奇啊!
还有更离谱的
Java多线程:Volatile关键字
我加上创建一个字符串线程也会停止,但是呢,如果加上一个创建数组的对象的却不可以了。

class test {
	int x;
}