public class TT implements  Runnable{
  int b=100;
    
  public synchronized void m1(){
  b=1000;
  try{
  Thread.sleep(5000);
  }catch(Exception e){
  e.printStackTrace();
  }
  System.out.println("b="+b);
  }     public synchronized void m2(){
  b=2000;
  try{
  Thread.sleep(2500);
  }catch(Exception e){
  e.printStackTrace();
  }
  }   public void run(){
  try{
  m1();
  }catch(Exception e){
  e.printStackTrace();
  }   
  }   public static void main(String args[]){
  TT tt = new TT();
  Thread t = new Thread(tt);
  t.start();
  tt.m2();
  System.out.println(tt.b);
  }
}这个程序得到的结果是什么 为什么??? 不要只说结果啊,关键是为什么,然后得到的结果是固定的只有一个结果吗?还是有可能有不同的结果,和CPU是双核什么的有关系吗??? 这个问题困扰我两天了!!,马士兵讲堂上说的感觉也没有说清楚,我要详细答案!!!!

解决方案 »

  1.   

    输出结果不固定
    m1和m2都是修改了b的值之后sleep线程,看cpu时间片的分配情况
    所以输出结果可能是
    1000
    b=1000
    也可能是
    2000
    b=1000
      

  2.   

    我在t.start()以后,然后让主线程Thread.sleep(1000) 以后得到的结果是 b=1000    2000这个结果,我的理解是这样的,当调用t.start()以后,t线程并不一定会马上运行,而是出于就绪状态,这个时候分两种情况,1、如果它获得CPU的时间片马上执行,调用run()方法,然后调用m1方法把b的值改为1000,然后睡眠5秒钟,这个时候主线程执行,主线程调用m2方法,这个时候因为m2方法是synchronized,所以主线程得不到对象的锁,主线程锁不住对象,主线程什么都不能做只能等待t线程醒来 打印b=1000,打印完了 t线程就dead了,然后主线程执行m2方法,将b的值改为2000,然后将b的值输出,所以结果为 b=1000 2000;2、如果CPU没有给t线程分配时间片,这个时候主线程往下执行,主线程调用m2方法,将b的值改为2000,然后睡了2.5秒,这个时候,这个时候t线程开始执行,但是因为拿不到对象锁,所以出于阻塞状态,这个时候只能等待,主线程过了2.5秒醒来后,将b的值输出,主线程结束,然后t线程执行,将b的值改为1000,这个时候t线程睡眠5秒钟,然后将b=1000输出,这个时候的结果是 1000 b=1000,我的结果和楼上的有点不同,不知道是我错了还是楼上的错了,如果我错了请指出我哪些地方错了,谢谢,还有我引出了这个问题,我上面说到主线程结束,但是整个程序并没有结束这点是不是正确的????
      

  3.   

    如果m2 sync之后给你解释一下
    main执行到tt.start()时,有两种可能,一种是立即启动,一种是准备好,就绪状态,暂时不启动。
    启动事实也有可能是在tt.m2()之后启动,因为tt.m2()是主线程的一部分,不好说谁先启动的,这个跟代码前后没太大关系的,(你可以设置优先级或者让两代码之间加点废话,这另说)关键就看谁先启动了,只要有一个启动的,就会锁住当前对象TT,另外一个线程的另外一个方法的运行也需要锁对象,但是已经被提前锁了,所以只能等当前线程执行完在执行。结果就有很多种了
    1:tt.start(); tt.m2(); 这样的结果是
    b=1000
    20002:tt.m2(); tt.start(); 主程序输出;
    结果b=1000
    10003:tt.m2(); 主程序的输出; tt.start;
    结果
    2000
    b=1000