java中synchronized块的意外输出

时间:2018-05-08 18:37:54

标签: synchronization

这是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 12 14 16 18 20 5螺纹-0 10螺纹-0 15 20螺纹-0 25 30螺纹-0 35螺纹-0 40 45 50螺纹-1螺纹-1螺纹-1螺纹-1线程1

在这个结果中感觉有点尴尬。这是因为,我在printTbl()方法中使用块进行同步。在我调用 table1.start(); 之后,预计输出为 2 4 6 8 10 12 14 16 18 20 。但是在第一个块释放后,锁定了下一个for循环。但同时第二个线程 table2.start()得到了循环,它应该首先执行同步块,只执行下一个for循环,但是在这里,线程正在运行。为什么会这样?任何人都可以给我答案。

0 个答案:

没有答案