所有异步任务都可以读取的变量

时间:2015-06-26 16:53:36

标签: java multithreading asynchronous

我想要做的是在打印数组时跟踪变量。然而,令人困惑的是它是异步的。

这与我现在的相似。

public static int variable = 0;

public void print()
{
    System.out.println(array[variable]);
    variable ++;
}

然后另一个具有ExecutorService和CompletionService的类异步调用print()方法,该方法运行大约40个具有4个线程的作业(在我的示例中为11个作业)。

问题(我怎么看)是因为它是异步运行的,4个线程具有相同的变量值,或者它跳过一些值,因为2个线程同时完成,因此它增加了2。

我打印出变量值,这里有一些结果:

  1. 0 1 2 2 2 2 6 6 6 9 10
  2. 0 1 2 2 4 4 6 7 8 9 10
  3. 0 1 1 1 1 5 6 7 8 8 8

2 个答案:

答案 0 :(得分:2)

声明方法print()已同步。 或者将变量variable声明为AtomicInteger而不是int。

答案 1 :(得分:0)

您可以创建一个处理打印的新类:

public class SyncPrinter {
    public static int variable = 0;

    public static synchronized void print()
    {
        System.out.println(array[variable]);
        variable ++;
    }
}

然后将其称为SyncPrinter.print()