Java volatile Java虚拟机提供的最轻量级同步机制
2016-04-12 14:31
387 查看
看下面的代码:
理论上应该输出20000,但是结果却不是这样 每次运行也会有不同的结果
每个线程在运行的时候都有自己的工作内存,区别于主内存。它两的关系类似于cache和内存的关系。单个线程修改变量的值的时候只会修改自己工作内存中的值,修改完毕之后会通过一系列的操作同步到主内存中。普通的变量只能保证其在主内存中的一致性,不同线程的工作内存中的值可能是不同的。但是如果变量被volatile关键字修饰即可保证在多线程并行时各个线程可以看到一致的值。但是上面的代码显示却不是这样的,这是为什么?
答案是java的运算并非原子操作 :
问题出在这行代码上。
个人笔记,可能有误。
package testForThread; /* * volatile变量自增运算测试 * * @author wangGang */ public class VolatileTest { public static volatile int race = 0; public static void increace() { race = race + 1; } private static final int THREADS_COUNT = 20; public static void main(String[] args) { Thread[] threads = new Thread[THREADS_COUNT]; for (int i = 0; i < THREADS_COUNT; i++) { threads[i] = new Thread(new Runnable() { @Override public void run() { for (int j = 0; j < 10000; j++) { increace(); } } }); threads[i].start(); } while (Thread.activeCount() > 1) { Thread.yield(); } System.out.println(race); } }
理论上应该输出20000,但是结果却不是这样 每次运行也会有不同的结果
每个线程在运行的时候都有自己的工作内存,区别于主内存。它两的关系类似于cache和内存的关系。单个线程修改变量的值的时候只会修改自己工作内存中的值,修改完毕之后会通过一系列的操作同步到主内存中。普通的变量只能保证其在主内存中的一致性,不同线程的工作内存中的值可能是不同的。但是如果变量被volatile关键字修饰即可保证在多线程并行时各个线程可以看到一致的值。但是上面的代码显示却不是这样的,这是为什么?
答案是java的运算并非原子操作 :
<span style="font-size:18px;">race = race + 1;</span>
问题出在这行代码上。
个人笔记,可能有误。
相关文章推荐
- JAVA如何抛出异常
- LeetCode 35 -Search Insert Position ( JAVA )
- 学习JAVA中RSA算法实现
- Java学习之复制文件目录到指定文件夹
- 【转】Java判断是否是整数,小数或实数的正则表达式
- java 日期的加减
- Spring切点获取实体类数据
- java io流
- jpa整合spring和springData出错: Unable to build Hibernate SessionFactory
- Java 中的简单分割
- Java深度历险(五)——Java泛型
- 深入Java集合学习系列:HashMap的实现原理
- DOM4J 写入 XML 文件
- Java多线程--主线程等待所有子线程执行完毕
- 权限管理框架实现(1)--Struts切面处理
- MyEclipse自动生成注释,修改注释模板
- 学习札记:JVM的内存布局
- eclipse怎么设置字体大小
- Spring事务的5种模式
- java struts2自定义调用方法