gpt4 book ai didi

java - AtomicInteger 不会同时递增

转载 作者:搜寻专家 更新时间:2023-11-01 01:26:37 29 4
gpt4 key购买 nike

我正在测试类 AtomicInteger 的使用,但似乎没有在互斥控制下应用增量。

这是我的测试:

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 9

.怎么了?

编辑 @Louis Wasserman

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());
}

最佳答案

您正在获取它并通过两个单独的操作递增它。您正在打印第一个,这使您自己的代码成为非原子的。

每个 AtomicInteger 操作本身都是原子的,但您不能按顺序使用两个并考虑原子的组合——根据定义,两个操作不是原子的。

解决这个问题:

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

但是,正如评论中所指出的,您有第三 操作,即打印。这对于增量操作也不是原子的。因此,您需要将两者同步,以便按顺序打印列表。

您可以调用该方法 printAndIncrement

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

关于java - AtomicInteger 不会同时递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101864/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com