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();
}
}
任何人都可以解释一下这段代码的执行方式以及输出结果是什么?
答案 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)