Java的多线程问题?

2025-03-26 01:09:53
推荐回答(4个)
回答(1):

同样的代码,我使用JDK9在MacOS上运行结果并不会打印0.题主用的什么JDK的版本?

同时提醒题主,在while循环内执行与循环条件一致的if判断是毫无意义的。

回答(2):

你启动了两个线程t1和t2。

考虑执行到当num=1时,可能出现的一种情形:
当一个线程执行到if(num>0)时,因为num=1则if为真,而刚做出了此判断这个线程就被挂起了,它还来不及执行println。此时,又调度了另一个线程开始执行,当执行到if(num>0)时,因为num还是等于1,则if还是为真。
然后两个线程会分别执行println。而此时,有两种情况:
1.
因为此时num等于1,先执行的会输出1,然后num自减变为0,后执行的输出0,然后num自减变为-1,结果就是输出如上图所示。
2.
当然,还有一种情况,即先执行的输出1后被挂起,后执行的又输出了一个1,然后自减两次,num最后等于-1。

这些都是因为线程未同步造成的。

回答(3):

这不就是最基本的同步问题吗,多个线程访问一个变量
假设一种执行步骤:
Thread0 判断 num = 1, 进入循环体,进入if体, 由于 CPU调度, Thread0 挂起。
Thread1 获得cpu时间片, 判断num =1 , 进入循环, 并执行 num-- , 退出循环。
Thread0重新获得时间片,继续进行执行打印语句, 可不就是打印的0嘛。

回答(4):

for(int i=0;i<2;i++) { Thread t=new Thread(inc); t.start(); t=new Thread(dec); t.start(); } 这个循环决定的。当i=0,先后实例化了一个inc(即Thread-0)和一个dec(即Thread-1);当i=1,又实例化了一个inc(即Thread-2)和一个dec(即Thread-3);inc是递增,dec递减,就这样的