Это простая программа 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, но здесь поток работает альтернативно.Почему это так?Может кто-нибудь дать мне ответ.