想测试下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不就可以了?