当您运行三个线程并且每个线程递增一个 int 时会发生什么?

问题描述 投票:0回答:2
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();
   }
}

谁能解释一下这段代码是如何执行的以及输出是什么?

java multithreading concurrency
2个回答
1
投票

您期望的输出是:

Thread-0  
Thread-1  
Thread-2

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

如果您想知道为什么输出与您期望的不同,那是因为线程是并发运行的(同时)。 由于没有任何东西可以阻止线程同时递增

i
,因此两个或多个线程有可能同时执行完全相同的操作(例如,将
i
从 0 递增到 1)。

我必须运行几次才能获得并发访问并得到以下结果:

Thread-0
Thread-0
Thread-1

像这样可以产生几种不同结果的程序称为“非确定性”。这是存在数据竞争(访问i变量)的特殊情况。


修复此行为并获得一致输出的几种方法是使用锁定对象使

i++

操作

原子
,或使用AtomicInteger代替
int
    


0
投票

Thread-0 Thread-1 Thread-2

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

© www.soinside.com 2019 - 2024. All rights reserved.