civil_wf 2012-09-29 07:10
浏览 520
已采纳

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条回答 默认 最新

  • _1_1_7_ 2012-10-01 01: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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部