任何人都可以解释这段代码:
public class Main implements Runnable{
private int i;
public synchronized void run() {
System.out.print("i = "+ i +"\n");
if (i % 5 != 0) {
i++;
}
for (int x = 0; x < 5; x++, i++) {
if (x > 1) {
Thread.yield();
}
}
}
public static void main(String[] args) {
Main n = new Main();
for (int x = 100; x > 0; --x) {
new Thread(n).start();
}
}
}
以及输出如何
i= 0
i= 5
i= 10
i= 15
i= 20
.
.
.
i= 499
答案 0 :(得分:3)
底部循环创建100个线程。每个线程立即运行,与其他线程并行运行。在每个帖子中,
因此,如果可以被5整除,则i增加5次,如果不是5则增加6次。但是,run()方法是同步。 因此,当其中一个线程已经执行时,不允许执行其他线程:您的程序实际上是单线程的,yield()被忽略(没有其他线程可以执行),并且输出相同到
for (int i=0; i<500; i+= 5) System.out.println(i);
System.out.println(499);
删除synchronized以查看改变输出的各种竞争条件。
答案 1 :(得分:2)
主线程创建100个线程,每个线程执行一个synchronized方法,以便序列化它们的执行。每个线程打印i的当前值(默认情况下在开头为0)并将其递增5次,以便下一个获取cpu(并执行正文)的线程打印新值i
。
Thread.yield();
放弃CPU,但这并不意味着它释放了锁。这就是为什么每个线程在前一个线程完成后执行run
方法而不是其他方法。
答案 2 :(得分:1)
了解yield
does not release the monitor非常重要。因此,所有线程都按顺序运行,即yield
不允许其他线程运行,因为它位于synchronized
块内并且监视器保持锁定状态。