s*****o 发帖数: 76 | 1 高手帮我看看下面这段程序是怎么运行的?我怎么也想不出来
为什么结果是15 21。thx.
class NoGo implements Runnable {
private int i;
public void run() {
if (i%10 != 0) {
i++;
}
for(int x=0; x<10; x++, i++)
{
if (x == 4) {
Thread.yield();
}
}
System.out.print(i + " ");
}
public static void main(String [] args) {
NoGo n = new NoGo();
for(int x=0; x<2; x++) {
new Thread(n).start();
}
}
} | b*********u 发帖数: 471 | 2 what output are you expecting?
I think the output is nondeterministic due to data race.
【在 s*****o 的大作中提到】 : 高手帮我看看下面这段程序是怎么运行的?我怎么也想不出来 : 为什么结果是15 21。thx. : class NoGo implements Runnable { : private int i; : public void run() { : if (i%10 != 0) { : i++; : } : for(int x=0; x<10; x++, i++) : {
| B*********h 发帖数: 800 | 3 两个Thread,一个Runnable.
线程1:i == 0 after if{...}, i == 4 in for {...}before yielding.
线程2:i == 5 after if{...}, i == 10 in for{...}before yielding.
线程1:i == 10 after if{...}, i == 15 after for{...} completes. print 15.
线程2:i == 16 after if{...}, i == 21 after for{...} completes. print 21.
但是你并不能确定每次都能以这样的次序运行,这只是可能的运行次序的一种。就算你
不主动yield,还是有可能yield给其他的线程,只是这样简单的代码,这种可能性较小。
【在 s*****o 的大作中提到】 : 高手帮我看看下面这段程序是怎么运行的?我怎么也想不出来 : 为什么结果是15 21。thx. : class NoGo implements Runnable { : private int i; : public void run() { : if (i%10 != 0) { : i++; : } : for(int x=0; x<10; x++, i++) : {
| s*****o 发帖数: 76 | 4 搞明白了,多谢。
小。
【在 B*********h 的大作中提到】 : 两个Thread,一个Runnable. : 线程1:i == 0 after if{...}, i == 4 in for {...}before yielding. : 线程2:i == 5 after if{...}, i == 10 in for{...}before yielding. : 线程1:i == 10 after if{...}, i == 15 after for{...} completes. print 15. : 线程2:i == 16 after if{...}, i == 21 after for{...} completes. print 21. : 但是你并不能确定每次都能以这样的次序运行,这只是可能的运行次序的一种。就算你 : 不主动yield,还是有可能yield给其他的线程,只是这样简单的代码,这种可能性较小。
|
|