您的位置:首页 > 编程语言 > Java开发

Java volatile Java虚拟机提供的最轻量级同步机制

2016-04-12 14:31 351 查看
看下面的代码:
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>


问题出在这行代码上。

个人笔记,可能有误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: