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

Java 为什么结果是200,然后是100?,java,Java,因为在执行.start()时,线程将被安排执行。当对aa.m2()的调用正在执行时,速度会快得多(大多数情况下)。在aa.m2中,主线程将直接调用m2方法,因此它将是第一个被执行的方法,因为theadtt初始化和启动所需的时间很少m2方法是同步的,因此它将获取对象的锁aa,然后当线程tt完成初始化时,它将调用m1方法,并等待对象aa的锁被释放(m1方法也是同步的).为什么你认为它应该是100加200(虽然有时可能是这样)?这个问题获得了赞成票,这让我很沮丧。非常感谢。我总是混淆线程,这真的很难理

因为在执行.start()时,线程将被安排执行。当对aa.m2()的调用正在执行时,速度会快得多(大多数情况下)。

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

为什么你认为它应该是100加200(虽然有时可能是这样)?这个问题获得了赞成票,这让我很沮丧。非常感谢。我总是混淆线程,这真的很难理解。
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();
    }
}