首页 > 代码库 > JAVA多线程并发变量控制方法之volatile修饰工作原理
JAVA多线程并发变量控制方法之volatile修饰工作原理
在JAVA中,每个线程都有一块属于自己的工作内存区,该内存区会保存一份从主内存拷贝过来的公共变量值。不加volatile修身的变量在每个线程中的值修改一般都是独立的。及如下图所示。
1.开始执行时A、B线程从主内存区load变量i=0.此时值是一样的。
2.当B线程将变量i=1时,此时并不会立刻写入i=1到主内区,所以A线程工作区i还是等于0.
3.如果i变量用Volatile修饰后,B线程改变变量i的值,会立刻返回写回主内存区中。如下图所示。
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修饰工作原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。