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

来源:互联网 发布:mac打开照片 编辑:程序博客网 时间:2024/05/22 17:00
看下面的代码:
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() {@Overridepublic 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>

问题出在这行代码上。

个人笔记,可能有误。



0 0
原创粉丝点击