civil_wf 2012-09-29 15: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 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]

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

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大