这是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循环,但是在这里,线程正在运行。为什么会这样?任何人都可以给我答案。