下面是一段volatile变量自增元算测试:
/**
* @title VolatileTest.java
* @description volatile变量自增运算测试
* @date 2014-02-28 11:48
* @author lichunan
* @version 1.0
*/
public class VolatileTest {
public static volatile int race = 0;
public static void increase() {
race++;
}
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 i=0; i < 10000; i++){
increase();
}
}
});
threads[i].start();
}
// 等待所有累加线程都结束
while(Thread.activeCount() > 1){
Thread.yield();
}
System.out.println(race);
}
}
这段代码发起了20个线程,每个线程对race变量进行10000次自增操作,如果这段代码能够正确并发的话,最后输出的结果应该是200000。但实际是每次输出的结果都不一样。
原因如下: