Неожиданный вывод синхронизированным блоком в Java - PullRequest
0 голосов
/ 08 мая 2018

Это простая программа Java, которая иллюстрирует блок синхронизации.Внимательно посмотрите на эту программу.

class Table{
public void printTbl(int n){
    //synchronize block
    synchronized(this){
        for(int i=1; i<11; i++){
            System.out.print(" "+i*n);
            try{
                Thread.sleep(600);
            }catch(Exception e){}
        }
    }//synchornize block end
    for(int j=0; j<5; j++){
        System.out.print(" "+Thread.currentThread().getName());
        try{
            Thread.sleep(1000);
        }catch(Exception e){}
    }
}
}
class Table1 extends Thread{
Table t;
public Table1(Table t){
    this.t=t;
}
public void run(){
    t.printTbl(2);
}
}
class Table2 extends Thread{
Table t;
public Table2(Table t){
    this.t=t;
}
public void run(){
    t.printTbl(5);
}
}
public class Sync2{
public static void main(String... args){
    Table tb=new Table();
    Table1 table1=new Table1(tb);
    Table2 table2=new Table2(tb);
    table1.start();
    table2.start();
}

}

После компиляции и выполнения этой программы я получил следующий результат.

2 4 6 8 10 1214 16 18 20 5 Нить-0 10 Нить-0 15 20 Нить-0 25 30 Нить-0 35 Нить-0 40 45 50 Нить-1 Нить-1 Нить-1 Нить-1 Нить-1

В этом результате чувствую что-то неловкое.Это потому, что у меня есть make-блок в методе printTbl () synchornize.После того, как я позвонил table1.start (); , ожидалось, что результат будет 2 4 6 8 10 12 14 16 18 20 .Но после освобождения первого блока была выполнена блокировка следующего цикла.Но в то же время второй поток, который является table2.start () , получил цикл, и он должен сначала выполнить блок синхронизации, а затем только следующий цикл for, но здесь поток работает альтернативно.Почему это так?Может кто-нибудь дать мне ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...