Java 可由所有异步任务读取的变量
我要做的是在打印数组时跟踪变量。然而,令人困惑的是它是异步的 这和我现在的情况很相似Java 可由所有异步任务读取的变量,java,multithreading,asynchronous,Java,Multithreading,Asynchronous,我要做的是在打印数组时跟踪变量。然而,令人困惑的是它是异步的 这和我现在的情况很相似 public static int variable = 0; public void print() { System.out.println(array[variable]); variable ++; } 然后是另一个包含ExecutorService和CompletionService的类,该类异步调用print()方法,该方法使用4个线程运行大约40个作业(在我的示例中是11个作业
public static int variable = 0;
public void print()
{
System.out.println(array[variable]);
variable ++;
}
然后是另一个包含ExecutorService和CompletionService的类,该类异步调用print()方法,该方法使用4个线程运行大约40个作业(在我的示例中是11个作业)
问题(我怎么看)是,因为它是异步运行的,所以4个线程的变量值相同,或者它跳过了一些值,因为2个线程同时完成,所以它增加了2
我打印了变量值,下面是一些结果:
0122616910
01244678910
01156788
声明方法
print()
synchronized。
或者将变量
variable
声明为AtomicInteger而不是int。您可以创建一个处理打印的新类:
public class SyncPrinter {
public static int variable = 0;
public static synchronized void print()
{
System.out.println(array[variable]);
variable ++;
}
}
然后将其称为
SyncPrinter.print()
为什么变量是全局的?如果它是本地的,线程之间就不会相互干扰。@tschwab我希望它是全局的,这样每个线程都会得到更新的变量。就像一个线程向变量添加了1,那么其他线程就会知道,这样下一个线程就会打印2。编辑:我试着使它成为本地的,但它没有帮助:\Wow AtomicInteger是惊人的,但是,它并没有解决我的问题。我将代码改为:AtmoicInteger变量=new AtomicInteger(0)
和System.out.println(array[variable.addAndIncrement)
。这些是结果3 3 3 4 11 11 11
和3 5 6 7 11 11 11
编辑:我尝试了同步,但没有成功。重点是在运行print()
时必须锁定变量。声明print()
synchronized应该可以工作。@tschwab我认为它不工作,因为当它锁定时,它将变量与其他4个线程锁定,因此它们有可能都锁定了相同的数字?线程同时运行(据我所知)“不可能在同一个对象上交替调用两个同步方法。”我猜不同的对象正在调用print()
function?一个可能的解决方案是创建一个处理打印的新对象。@tschwab你知道了。不同的对象正在调用打印函数,我只是简单地更改了它,以便只调用一个对象。如果你用你所说的做了另一个回答,我很乐意选择你的答案(包括已同步!这带来了很大的不同):D谢谢你的帮助!!编辑:(NVM我会把这个标记为答案!)等等,为什么要创建一个新类?这个类将与我已经拥有的类相同。