civil_wf
civil_wf
2012-09-29 15:10
浏览 496
已采纳

AtomicInteger真的支持并发操作吗?

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下测试都不正确。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • u011606457
    _1_1_7_ 2012-10-01 09:34
    已采纳

    [quote] public static Bean getInstance()

    {

    return b == null ? b = new Bean() : b;

    } [/quote]

    这个方法缺少同步
    [code="java"]
    public synchronized static Bean getInstance()

    {

    return b == null ? b = new Bean() : b;

    }
    [/code]

    点赞 评论
  • jinnianshilongnian
    jinnianshilongnian 2012-09-29 16:17

    不是并发 是原子 即+/-数是原子的

    点赞 评论

相关推荐