public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
b = 1000;
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
b = 2000;
System.out.println("b="+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();//调用 M1
tt.m2();
System.out.println(tt.b);
}
}
程序运行结果为什么是
b=2000
2000
b=1000搞不懂啊 为什么不先调用m1()这个方法啊  还有就是最后结果为什么是1000啊

解决方案 »

  1.   

    你启用了另外的一个线程t,t的执行时间和顺序就交给操作系统去调度了,这个什么时候执行就不一定了,也就是说,在输出结果中b=1000的顺序不一定在什么地方出现,也许你再执行一次就在第一个了,但可以肯定的是:
    tt.m2();
    System.out.println(tt.b);
    这两个是按顺序来执行的,就是结果中一定是:
    先输出b=2000,再输出2000。
      

  2.   

    我每次执行都是b=2000
    2000
    b=1000
    这个结果啊 测试了 N次了  为啥啊
      

  3.   

    你先看到两个2000说明系统调度时先跑完主线程main函数再跑tt线程调用m1函数你可以再tt.m2()前加一句 Thread.sleep(1); 试试,意思是让主线程挂起1毫秒,不出意外的话这时系统将切换到tt线程跑m1,也就是你想要的结果
      

  4.   

     先执行主线程,当主线程的时间片用完后再执行另一个线程,所以在t.start();//调用 M1,新建的线程将挂起,主线程继续执行tt.m2(); System.out.println(tt.b);这是b的值还是2000,等主线程执行结束才开始执行新建的线程M1,b=1000,打印出来。
    你可以在t.start();//调用 M1后加一句Thread.sleep(10);这样就是你想要的结果了。
      

  5.   

    1楼已经正解 楼主好好想想吧 你可以在m2()里面加一个sleep 就可以看出同步的效果了 不然这样结果 不确定