为什么结果是200然后是100?

时间:2016-01-24 16:16:18

标签: java

class A implements Runnable {
    static int b = 10;

    public void run() {
        m1();
    }

    public synchronized void m1() {
        b = 100;
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(b);
    }

    public synchronized void m2() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        b = 200;
        System.out.println(b + "m2");

    }

    public static void main(String[] args) {
        A aa = new A();
        Thread tt = new Thread(aa);
        tt.start();
        aa.m2();
    }
}

2 个答案:

答案 0 :(得分:0)

因为当你在做.start()时,线程将被安排执行。虽然对aa.m2()的调用正在执行,并且会更快(大多数时候)。

答案 1 :(得分:0)

aa.m2中,主线程将直接调用m2方法,因此它将是第一个被执行的方法,因为thead tt只需要很少的时间来初始化和启动。 m2方法已同步,因此它将获取对象aa的锁定,然后当线程tt完成初始化时,它将调用m1方法并等待锁定要释放的对象aam1方法也已同步)。