Я написал следующий код:
public class ClassAndObjectLock {
public static void main(String[] args) {
new Thread(new EvenThread()).start();
new Thread(new OddThread()).start();
}
}
class EvenThread implements Runnable {
public void run() {
for (int i = 0; i < 10; i += 2) {
CommonClass.printEvenNumber(i);
}
}
}
class OddThread implements Runnable {
public void run() {
for (int i = 1; i < 10; i += 2) {
CommonClass.printOddNumber(i);
}
}
}
class CommonClass {
public static void printEvenNumber(int num) {
synchronized (CommonClass.class) {
System.out.println("Even :" + num);
}
}
public static void printOddNumber(int num) {
synchronized (CommonClass.class) {
System.out.println("Odd :" + num);
}
}
}
Когда я выполняю приведенный выше код, вывод следующий:
Even :0
Odd :1
Even :2
Odd :3
Even :4
Odd :5
Even :6
Odd :7
Even :8
Odd :9
Я не понимаю этот вывод.Насколько я понимаю, когда new Thread(new EvenThread()).start();
выполняется, он порождает поток класса EvenThread
, который должен получить блокировку CommonClass
и сохранить блокировку при себе, пока не напечатает все четные значения,Объект OddThread
должен получить шанс только после того, как объект EvenThread
закончен.Поэтому, по моему мнению, результат должен быть следующим:
Even :0
Even :2
Even :4
Even :6
Even :8
Odd :1
Odd :3
Odd :5
Odd :7
Odd :9
Может ли кто-нибудь объяснить мне основную логику?