首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicInteger不并发递增

AtomicInteger不并发递增
EN

Stack Overflow用户
提问于 2014-01-13 21:36:22
回答 1查看 2.7K关注 0票数 4

我正在测试类AtomicInteger的使用,但是增量似乎不适用于互斥控制。

这是我的测试:

代码语言:javascript
复制
static class AtomicIntegerRunnable implements Runnable
{
    private static AtomicInteger x;

    AtomicIntegerRunnable() {}

    AtomicIntegerRunnable(AtomicInteger x) 
    {
        this.x = x;
    }

    @Override
    public void run()
    {
        System.out.println(x.get());
        x.getAndIncrement();
    }
}

public static void main(String[] args) {
    ExecutorService e = Executors.newFixedThreadPool(n_whatever);
    AtomicInteger x = new AtomicInteger();
    int n = 10;
    for (int i=0; i<n; i++) {
        e.submit(new AtomicIntegerRunnable(x));
            }
    e.shutdown();
    while (!e.isTerminated());
}

在印刷品上,我得到的东西是

0 0 1 1 1 5 4 3 2 6

而不是

0 1 2 3 4 5 6 7 8

。怎么了?

编辑 @Louis

代码语言:javascript
复制
static class AtomicIntegerRunnable implements Runnable
{
    private AtomicInteger x;

    AtomicIntegerRunnable() {}

    AtomicIntegerRunnable(AtomicInteger x) 
    {
        this.x = x;
    }

    @Override
    public void run()
    {
        x.getAndIncrement();
    }
}

public static void main(String[] args) 
{
    ExecutorService e = Executors.newFixedThreadPool(n_whatever);
    AtomicIntegerRunnable x = new AtomicIntegerRunnable(new AtomicInteger());
    int n = 10;
    for (int i=0; i<n; i++) 
        e.submit(x);
    e.shutdown();
    while (!e.isTerminated());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 21:39:22

您将得到它并在两个单独的操作中递增它。您正在打印第一个,这使您自己的代码非原子化。

每个AtomicInteger操作在其自身的上都是原子操作,但您不能按顺序使用两个操作,并且考虑组合原子-通过定义,两个操作不是原子操作。

要解决这个问题:

代码语言:javascript
复制
@Override
public void run()
{
    System.out.println(x.getAndIncrement());
}

但是,正如评论中所指出的,你还有第三个动作,就是打印。对于增量操作,这也不是原子的。因此,您需要同步这两者,以使您的列表打印出来的顺序。

您可以将该方法称为printAndIncrement

通常,AtomicInteger更多地用于确保多线程代码不会意外地对同一个整数进行操作,而不是确保外部系统(如输出缓冲区)按顺序看到这些增量(因为您仍然需要其他东西来与该外部系统同步通信)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21101864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档