JDK1.5中新增类AtomicInteger,支持免锁方式(原子方式)的更新Int的类,声明是线程安全的。我写了一个简单测试类,两个线程同时更新一个AtomicInteger,运行结果却和期望不一致,是否是程序写的有问题,还是AtomicInteger有问题?
[code="java"]import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class TestVolatile
{
public static void main(String[] args)
{
for (int i = 0; i < 10; i++)
{
ExecutorService exe = Executors.newCachedThreadPool();
exe.execute(new VAddThead());
exe.execute(new VAddThead());
exe.shutdown();
while (!exe.isTerminated())
;
System.out.println(Bean.getInstance().getI());
}
}
}
class VAddThead implements Runnable
{
@Override
public void run()
{
for (int i = 0; i < 100; i++)
{
Bean.getInstance().addI();
}
}
}
class Bean
{
private static Bean b = null;
private volatile AtomicInteger i = new AtomicInteger(0);
private Bean()
{
}
public static Bean getInstance()
{
return b == null ? b = new Bean() : b;
}
public void addI()
{
i.getAndIncrement();
}
public int getI()
{
return i.get();
}
}[/code]
期望运行结果:
[code="java"]200
400
600
800
1000
1200
1400
1600
1800
2000
[/code]
实际多次运行的结果都不一样,是何原因?本机的环境是JDK1.6.0_13,在windows和linux下测试都不正确。