package com.KnightX;public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{
//Thread.sleep(2000);
System.out.println("m1");
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}

public synchronized void m2() throws Exception {
System.out.println("m2");
Thread.sleep(2500);
b = 2000;
System.out.println("2b"+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);
//tt.m1();
t.start();
//Thread.sleep(100);
tt.m2();
System.out.println(tt.b);
}
}上述代码中,m1,m2是同步方法,输出的结果是:
m2
2b2000
2000
m1
b = 1000
我不明白为什么m2比m1先执行,t.start()这行代码是在tt.m2()之前的,我感觉应该是m1先拿到锁的
求指点~~谢谢

解决方案 »

  1.   

    m2()在main 线程运行,直接就执行!
    而 m1  是在一个新建的线程里, 启动后在"可运行"状态,需要等待JVM的调度变成"运行"状态. 所以是m2先运行. 
    个人浅见.
      

  2.   

    渴望求解释,按照楼主的写法,我用debug调试,发现结果相反,先执行m1再执行m2
      

  3.   

    这个执行结果是不确定的,线程执行不是哪个先start就先执行哪个,是不确定的