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();
}
}
谁能解释一下这段代码是如何执行的以及输出是什么?
您期望的输出是:
Thread-0
Thread-1
Thread-2
但是,如果您拥有一台多核机器,您会在运行几次后意识到它并不总是打印此结果。
如果您想知道为什么输出与您期望的不同,那是因为线程是并发运行的(同时)。 由于没有任何东西可以阻止线程同时递增
i
,因此两个或多个线程有可能同时执行完全相同的操作(例如,将 i
从 0 递增到 1)。
我必须运行几次才能获得并发访问并得到以下结果:
Thread-0
Thread-0
Thread-1
像这样可以产生几种不同结果的程序称为“非确定性”。这是存在数据竞争(访问i
变量)的特殊情况。
修复此行为并获得一致输出的几种方法是使用锁定对象使
i++
操作
原子,或使用
AtomicInteger
代替int
。