[英]Java Multi-Threading unexpected result
我有一个带有3个线程的简单Java程序,每个线程递增1,然后打印一个变量counter
。 Java代码是-
public class test implements Runnable {
private int counter=0;
public static void main(String args[]){
test t=new test();
Thread t1=new Thread(t,"THREAD 1");
Thread t2=new Thread(t,"THREAD 2");
Thread t3=new Thread(t,"THREAD 3");
t1.start();
t2.start();
t3.start();
}
public void run(){
counter=counter+1;
System.out.println(Thread.currentThread().getName()+" "+ counter);
}
}
理解方法run
是不同步的,线程可以以任何方式进行交织,从而给出任何结果,但是我得到的大部分结果(我已多次运行程序)是-
THREAD 1 2
THREAD 3 3
THREAD 2 2
我不明白为什么永远不会打印1
,甚至在打印3
之后也要再次打印2
(因为在打印时counter
最新值已设置为3
)。
另外,变量counter
在3个线程之间共享? 如果我将其设为static
,它将被共享,但在这种情况下会共享。
请解释。
首先,所有线程共享实例变量,因为它们共享可运行类的相同实例(在您的代码中,只有一次“ new test()”)。
为什么值1从不打印? 由于指令的顺序是由JVM实现,操作系统和硬件决定的(通常是不可预测的),因此回答起来会有些复杂。 在您的情况下,似乎在2个增量指令之后调用了print函数。 (如果您认为打印比增加变量慢,则可以理解)。
最后,由于println函数不同步,因此可以在值3之后打印值2,这意味着也可以交错打印函数中的指令。 因此,在这种情况下,第2个线程上的print函数在第3个线程上的函数之前被调用,但是第一个完成的函数是第3个线程。
希望对您有所帮助。
如果您使用
test tOne=new test();
test tTwo=new test();
test tThree=new test();
Thread t1=new Thread(tOne,"THREAD 1");
Thread t2=new Thread(tTwo,"THREAD 2");
Thread t3=new Thread(tThree,"THREAD 3");
t1.start();
t2.start();
t3.start();
输出将是这样的
THREAD 2 1
THREAD 1 1
THREAD 3 1
因为您在所有三个线程中使用了相同的t实例,所以共享了counter
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.