【问题标题】:Atomic Integer increment program not working as expected原子整数增量程序未按预期工作
【发布时间】:2016-10-03 10:06:57
【问题描述】:

我正在尝试使用原子整数实现计数器,然后在所有线程完成任务后打印最终值,但我没有得到最新值,在我的情况下,我应该得到的值应该是 20,但它在波动比如 17,18,16,19,20 等

程序如下:

class AtomicOperations implements Runnable 
{
private AtomicInteger ai;
private int a;

AtomicOperations(int aivalue, int ivalue) {
    ai = new AtomicInteger(aivalue);
    this.a = ivalue;
}

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

  public static void main(String args[]) {
    AtomicOperations obj = new AtomicOperations(10, 10);
    Thread[] t = new Thread[10];
    synchronized (obj) {
        for (int i = 0; i < t.length; i++) {
            t[i] = new Thread(obj, "Thread-" + (i + 1));
            t[i].start();
        }
    }
    System.out.println(obj.ai);
  }
}

【问题讨论】:

  • 您认为您的synchronized(obj) 有什么用处?
  • Atomic 不需要同步。
  • @Kayaman .. 我认为这可能会在打印语句运行之前完成所有线程
  • @Amol 它没有。它不做那种事情。实际上,在您的代码中,它绝对没有任何作用。如果你在猜测,你就没有机会编写正确的多线程代码。

标签: java multithreading atomic


【解决方案1】:

您不会等到线程完成,因此打印时已完成的增量数可能会有所不同。

【讨论】:

  • 我添加了一个同步块..我认为这是我做的
  • 如果你在不了解准确你需要什么同步的情况下到处乱扔东西,你将永远不会让同步工作。在这里,您需要一些方法来知道线程何时完成。 synchronized 块不会等待某事完成,它只是不会在中间中断它。 (或多或少。)虽然在这里它什么都不做,因为它不保护任何共享的东西。
  • 点...主要执行将超过同步块..所以我需要使用 join() ?
  • @Amol 那将是一种选择。就个人而言,我不喜欢使用join,但在这种情况下,它恰好可以满足您的需求,因此它可能是最简单的解决方案。 (我不喜欢使用join,因为你真正想要等待的是要完成的工作,而不是要完成的线程。所以虽然它可以工作,但它并不优雅,并且会使设计变得脆弱,因为你以后不能在不破坏同步的情况下让线程也做其他事情。)
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多