以下程序的输出是什么?谁能解释程序是如何执行的?

时间:2015-05-30 15:18:42

标签: java multithreading concurrency

class A implements Runnable{
   int i=0;
   public void run(){
      System.out.println("Thread-"+i++);
   }
}

class Demo {
   public static void main(String []args) {
      A a=new A();
      Thread t1=new Thread(a);
      Thread t2=new Thread(a);
      Thread t3=new Thread(a);
      t1.start();
      t2.start();
      t3.start();
   }
}

任何人都可以解释一下这段代码的执行方式以及输出结果是什么?

2 个答案:

答案 0 :(得分:1)

您希望输出为:

Thread-0  
Thread-1  
Thread-2

但是如果你拥有一台多核机器,你会在几次运行后意识到它并不总能打印出这个结果。

如果您想知道为什么输出与您期望的输出不同,那是因为线程正在同时运行(同时)。 由于没有任何东西可以阻止线程同时递增i,因此两个或多个线程可以同时执行完全相同的操作(将i从0递增到1,实例)。

我必须运行它几次以获得并发访问并获得此结果:

Thread-0
Thread-0
Thread-1

这样可以产生多种不同结果的程序称为nondeterministic。这是一个特殊情况,其中有data race(访问i变量)。

修复此行为并获得一致输出的几种方法是使用锁定对象进行i++操作 atomic ,或使用AtomicInteger代替int

答案 1 :(得分:0)

输出

Thread-0
Thread-1
Thread-2

订单保持不变,因为它们已同步。在线查看结果 - IDEone