【发布时间】:2015-06-26 16:53:36
【问题描述】:
我正在尝试做的是在打印数组时跟踪变量。然而,令人困惑的是它是异步的。
这和我现在的差不多。
public static int variable = 0;
public void print()
{
System.out.println(array[variable]);
variable ++;
}
然后是另一个具有 ExecutorService 和 CompletionService 的类,它异步调用 print() 方法,它使用 4 个线程运行大约 40 个作业(在我的示例中是 11 个作业)。
问题(我怎么看)是因为它是异步运行的,所以 4 个线程具有相同的变量值,或者它跳过了一些值,因为 2 个线程同时完成,因此它增加了 2。
我打印了变量值,下面是一些结果:
-
0 1 2 2 2 2 6 6 6 9 10 0 1 2 2 4 4 6 7 8 9 100 1 1 1 1 5 6 7 8 8 8
【问题讨论】:
-
为什么
variable是全球性的?如果是本地的,线程就不会相互干扰。 -
@tschwab 我希望它是全局的,这样每个线程都会得到更新的变量。就像如果一个线程将 1 添加到变量,那么其他线程会知道,因此下一个线程将打印 2。编辑:我尝试将其设为本地,但没有帮助:\
标签: java multithreading asynchronous