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

JAVA多线程并发变量控制方法之volatile修饰工作原理

时间:2014-12-01 16:03:55      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:volatile   线程安全   并发   java   

在JAVA中,每个线程都有一块属于自己的工作内存区,该内存区会保存一份从主内存拷贝过来的公共变量值。不加volatile修身的变量在每个线程中的值修改一般都是独立的。及如下图所示。

 

1.开始执行时AB线程从主内存区load变量i=0.此时值是一样的。


bubuko.com,布布扣


2.当B线程将变量i=1时,此时并不会立刻写入i=1到主内区,所以A线程工作区i还是等于0.

bubuko.com,布布扣


3.如果i变量用Volatile修饰后,B线程改变变量i的值,会立刻返回写回主内存区中。如下图所示。

bubuko.com,布布扣



package list;

public class Test {

	volatile int i = 0;

	public void tryExit() { 
		if (i != i) {//当左边i读取内存值后,swapValue立刻改变了 i的值,当右i读取内存值,就会发现值变化了,
			//所以程序就会出现i的值可以两边不一样的结果出现。如果不加volatile立刻更新值,应该会一直执行下去
			System.out.println(i + " " + i);
			System.exit(0);
		}
	}

	public void swapValue() {
		i = i + 1;
	}

	public static void main(String[] args) {
		final Test volObj = new Test();
		Thread mainThread = new Thread() {
			public void run() {

				System.out.println("mainThread start");
				while (true) {
					volObj.tryExit();
				}
			}
		};

		mainThread.start();

		Thread swapThread = new Thread() {
			public void run() {
				System.out.println("swapThread start");
				while (true) {
					volObj.swapValue();
				}
			}
		};

		swapThread.start();

		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}

当使用volatile修饰变量i时,某个线程改变i的值时,会写回到主内存区,从而每个线程在使用时会是最新的值。 但不能代替synchronized,因为当A线程中,B线程中 i变量都为1时,某个时间AB线程同时执行i++. 最终i的值会为2.因为没有锁。这点需要注意下。



JAVA多线程并发变量控制方法之volatile修饰工作原理

标签:volatile   线程安全   并发   java   

原文地址:http://blog.csdn.net/tianyijavaoracle/article/details/41647471

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