Я пытался изучить синхронизацию потоков в java, и я узнал о синхронизированном блоке. Возможно, я задаюсь глупым вопросом, поскольку я мало знаю о синхронизации потоков, но в этой программе я не понимаю поведение блока.Не могу понять Синхронизированный блок в java
class Table {
void printTable(int n) { //method not synchronized
for(int i=1; i<=10; i++) {
System.out.println(n + " * " + i + " = " + n*i);
try {
Thread.sleep(500);
} catch(Exception e) {
System.out.println(e);
}
}
System.out.println("Table of " + n + " is completed.");
}
}
class MyThread extends Thread {
Table t;
int num;
MyThread(Table t, int num) {
this.t = t;
this.num = num;
}
public void run() {
synchronized(t) {
t.printTable(num);
}
}
}
class TestSynchronization {
public static void main(String[] args) {
Table obj = new Table(); //only one object
MyThread t1;
MyThread t2;
t1 = new MyThread(obj, 10);
t2 = new MyThread(obj, 17);
t1.start();
t2.start();
}
}
Это выход, как это:
10 * 1 = 10
10 * 2 = 20
10 * 3 = 30
10 * 4 = 40
10 * 5 = 50
Table of 10 is completed.
17 * 1 = 17
17 * 2 = 34
17 * 3 = 51
17 * 4 = 68
17 * 5 = 85
Table of 17 is completed.
которая кажется адекватной, но когда я пытаюсь сделать то же самое, удалив синхронизированный блок из метода выполнения и appying его в obj
объект void main
он показывает разные вывод.
class Table {
void printTable(int n) { //method not synchronized
for(int i=1; i<=5; i++) {
System.out.println(n + " * " + i + " = " + n*i);
try {
Thread.sleep(500);
} catch(Exception e) {
System.out.println(e);
}
}
System.out.println("Table of " + n + " is completed.");
}
}
class MyThread extends Thread {
Table t;
int num;
MyThread(Table t, int num) {
this.t = t;
this.num = num;
}
public void run() {
t.printTable(num);
}
}
class TestSynchronization {
public static void main(String[] args) {
Table obj = new Table(); //only one object
MyThread t1;
MyThread t2;
synchronized(obj) {
t1 = new MyThread(obj, 10);
t2 = new MyThread(obj, 17);
}
t1.start();
t2.start();
}
}
Выход:
10 * 1 = 10
17 * 1 = 17
10 * 2 = 20
17 * 2 = 34
17 * 3 = 51
10 * 3 = 30
17 * 4 = 68
10 * 4 = 40
10 * 5 = 50
17 * 5 = 85
Table of 17 is completed.
Table of 10 is completed.
Почему это не работает во втором случае, пожалуйста, объясните мне.
Также предлагайте мне способ, которым я могу получить тот же вывод, используя синхронизированный блок в void main
, если это возможно.
Почему при голосовании оп? вопрос выглядит совершенно разумным для меня .. если вы не думаете, что это вопрос домашней работы, который ... hmmm – ultrajohn