码迷,mamicode.com
首页 > 编程语言 > 详细

Java并发编程_volatile关键字的用法(二)

时间:2018-05-19 23:28:30      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:string   new   出现   sys   cep   ext   现象   while   变量   

 

被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。

 

根据下面实例理解:

 

package sync;

public class VolatileTest extends Thread{
	//全局变量isRunning加不加Volatile的效果
	private /*volatile*/ boolean isRunning = true;
	
	private void setRunning(boolean isRunning) {
		this.isRunning = isRunning;
	}
	
	@Override
	public void run() {
		System.out.println("进入run方法..");
		//一直循环,直到isRunning变为false
		while(isRunning) {
			//...
		}
		System.out.println("线程停止");
	}
	
	public static void main(String[] args) throws InterruptedException {
		//新建一个实例对象
		VolatileTest rt = new VolatileTest();
		//调用run方法
		rt.start();
		Thread.sleep(3000);
		
		//设置isRunning变量为false
		rt.setRunning(false);
		System.out.println("isRunning的值已变成false");
		Thread.sleep(3000);
		System.out.println(rt.isRunning);
	}
}

 

不加volatile输出结果:

技术分享图片

可以看到,线程没有停止,还在run()方法里一直循环,

我们在main方法里设置了全局变量isRunning为false,线程执行run方法时没有生效

 

加volatile输出结果:

技术分享图片

可以看到,线程及时接收到isRunning的值改变了

 

结论:

(1)不使用volatile:

线程执行的run方法使用全局变量时,会在刚开始加载一次全局变量的值,后面不再加载

(2)使用volatile:

线程执行的run方法使用全局变量时,会在刚开始加载一次全局变量的值,每当volatile修饰的变量改变,都会通知run方法重新加载新的值

 

 

 

全局变量isRunning的值放在主内存1

线程执行run方法时,它里面的值在另一个独立内存区域2

run方法每次执行,都会在第一次执行时读取主内存1的isRunning的值,复制到run方法的独立内存2

 

Java并发编程_volatile关键字的用法(二)

标签:string   new   出现   sys   cep   ext   现象   while   变量   

原文地址:https://www.cnblogs.com/Donnnnnn/p/9061878.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!