我正在测试类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
。怎么了?
编辑 @Louis
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());
}发布于 2014-01-13 21:39:22
您将得到它并在两个单独的操作中递增它。您正在打印第一个,这使您自己的代码非原子化。
每个AtomicInteger操作在其自身的上都是原子操作,但您不能按顺序使用两个操作,并且考虑组合原子-通过定义,两个操作不是原子操作。
要解决这个问题:
@Override
public void run()
{
System.out.println(x.getAndIncrement());
}但是,正如评论中所指出的,你还有第三个动作,就是打印。对于增量操作,这也不是原子的。因此,您需要同步这两者,以使您的列表打印出来的顺序。
您可以将该方法称为printAndIncrement。
通常,AtomicInteger更多地用于确保多线程代码不会意外地对同一个整数进行操作,而不是确保外部系统(如输出缓冲区)按顺序看到这些增量(因为您仍然需要其他东西来与该外部系统同步通信)。
https://stackoverflow.com/questions/21101864
复制相似问题