gpt4 book ai didi

java - 为什么 m2() 先运行?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:42 25 4
gpt4 key购买 nike

下面是代码。输出为1000,b=1000。我不明白为什么 m2() 每次都先运行。

public class TT implements Runnable{
int b = 100;

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

public synchronized void m2() throws Exception {
Thread.sleep(2000);
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();// m1() starts

tt.m2();// m2() starts

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

}

最佳答案

真正的原因1 synchronized 关键字。

m2() 方法获取TT 实例上的锁,然后 hibernate 。同时,线程启动生效,run() 方法尝试调用m1()。但是 m1() 必须等到对 m2() 的调用完成并释放锁。

现在,如果新线程启动并设法在现有线程调用 m2() 之前调用 m1() ,那么您将以其他顺序查看事件。这在理论上是可能的……但在典型的 Java 平台上不太可能。 (通常情况下,父线程在启动子线程时不会取消调度。)

m2() 返回后发生的事情将决定您看到的输出。由于您直接访问 tt.b(没有任何同步),因此从理论上的角度来看,结果是不可预测的。


基本上,这只是说明sleep 是进行线程调度的错误方法。如果您希望一个线程上的一个事件先于另一个线程上的另一个事件发生,则线程需要明确协调。依赖 sleep 和偶然的计时效果(例如 thread.start() 通常需要很长时间)会给您带来不可靠的行为。

1 - 显然,它是事物的组合。但是 sleep 黑客没有按预期工作的真正原因是 synchronized 关键字。

关于java - 为什么 m2() 先运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com