关于线程同步的问题: 
例如下面的程序代码: 
两个方法被锁定了,为什么执行的时候是等m1 执行完了m2才能开始执行啊?? 而当m2没有被锁定的时候就不是呢?? 
public class TT implements Runnable 

int b=100; public synchronized void m1() throws Exception 

b=1000; 
Thread.sleep(5000); 
    
System.out.println("b=" + b); 
  } public  synchronized void m2() 

System.out.println(b); 
public void run() 

try 

m1(); 
    } 
catch(Exception e) 

e.printStackTrace(); 
    } 
} public static void main(String[] args) throws Exception 

TT tt=new TT(); 
Thread t=new Thread(tt); 
t.start(); Thread.sleep(1000); 
tt.m2(); 

} 请指点指点...初学者

解决方案 »

  1.   

    sleep不会释放对象锁,所以m2无法获得锁,就无法执行 没有对m2用synchronized 关键字时,不需要获得锁也能执行
      

  2.   

    首先,当t.start()执行之后,t线程先得到了对象的锁,所以该对象的所有受同步的方法就只能被t线程调用(未被同步的方法可以被别的线程调用),直到t线程执行完释放了该对象的锁之后,别的线程( main线程)才可以得到该对象的锁,继而调用该对象的方法(m2())。