问java中关于线程同步的问题

public class TT implements Runnable {
int b = 100;

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

public synchronized void m2() throws Exception {
    Thread.sleep(5000);
    b =2000;
}

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();

    tt.m2();
    System.out.println(tt.b);
}

}

最后打印的结果是
b =1000
1000

请问这个程序的执行顺序是怎么样的
m1() m2()这两个方法都被synchronized修饰是他们是怎么执行的

m1,m2执行顺序是不确定的。没有顺序可言,关键是thread.sleep后,谁先被唤醒。
这程序只能说先唤醒执行m1的概率高,所以打印出tt.b是1000,实际上几种组合都有可能。

System.out.println("b = " + b);打印出b=2000都可能。

但是这个程序的打印过程是
先等待2.5秒 然后输出一个1000
然后再等待5秒 输出一个b = 1000
所以我还是没有弄懂他的执行过程 那b=2000这个赋值去了哪里

首先System.out.println("b = " + b)这个输出的b肯定是1000,System.out.println(tt.b)这个输出的可能是1000可能是2000,看m1,m2执行顺序
其次这两个输出的前后顺序也不确定

线程开起的是m1,,,,m2并没有调用线程

程序执行时,系统会分配时间片,系统自动调用程序。执行长短不一定。