日期:2014-05-18  浏览次数:20632 次

并发问题,好疑惑!
想测试下AtomicInteger的线程安全的特性,于是有了下面的代码:

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.atomic.AtomicInteger;


public class Sync {
public static AtomicInteger i = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException, ExecutionException {

System.out.println(i);

ArrayList<FutureTask> tasks = new ArrayList<FutureTask>(1000);
for(int i = 0; i < 1000; i++){
 FutureTask task = new FutureTask(new Runnable() {
@Override
public void run() {
Sync.incrementI();
}
}, null);

new Thread(task).start();
tasks.add(i,task);
}

for(int i = 0; i < 1000; i++){
tasks.get(i).get();
}

System.out.println(i); 
}

public static void incrementI(){
for(int i =0 ;i<1000;i++)
Sync.i = new AtomicInteger(Sync.i.incrementAndGet());
}

}



执行结果:
0
941264

问题: 为何计数器没到100000?而且多次执行的结果有差异。 
猜测1:jvm虚拟机线程个数限制,导致程序没有正常运行?
猜测2:AtomicInteger没有正确使用?
请大神们解疑!!

------解决方案--------------------
incrementAndGet
自己本身就已经累加1了,不用其他的变量作为中介
------解决方案--------------------
Sync.i = new AtomicInteger(Sync.i.incrementAndGet());

为啥要重新new一个,直接inc不就可以了?