Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可由所有异步任务读取的变量_Java_Multithreading_Asynchronous - Fatal编程技术网

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我会把这个标记为答案!)等等,为什么要创建一个新类?这个类将与我已经拥有的类相同。