gpt4 book ai didi

Java 线程 Ping Pong 示例问题

转载 作者:行者123 更新时间:2023-12-01 22:27:46 24 4
gpt4 key购买 nike

我看过PingPong使用synchronized关键字的例子。基本上实际的例子是这样的:

public class PingPong implements Runnable {

synchronized void hit(long n) throws InterruptedException {

for (int i = 1; i < 3; i++)
System.out.print(n + "-" + i + " ");
}

public static void main(String[] args) {
new Thread(new PingPong()).start();
new Thread(new PingPong()).start();
}

public void run() {
try {
Long id = Thread.currentThread().getId();

hit(id);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

一般情况下,hit方法是不同步的,因为synchronized关键字只有在有一个对象时才起作用。所以结果可能是8-1 9-1 8-2 9-2或8-1 9-1 9- 2 8-2...(这是一个随机结果)。但在这个例子中,它给我们所有的时间 8-1 8-2 9-1 9-2 这有点奇怪,因为这意味着 hit 方法是同步的!!!.我修改了代码以再次检查 hit 方法必须未同步,因此我在 hit 方法的开头添加了 Thread.sleep(1000) ,它会像

synchronized void hit(long n) throws InterruptedException {
Thread.sleep(1000);
for (int i = 1; i < 3; i++)
System.out.print(n + "-" + i + " ");
}

现在,每次执行时代码都会给出随机结果。

我真的很困惑!!有人可以帮助我理解这个问题吗?

最佳答案

您确实有两个单独的 PingPong 实例,这意味着将有两个单独的监视器对象,这意味着线程不会被强制同步运行。

我认为您可能遇到了线程调度行为。在单核 CPU 上,代码可以很好地按照您所描述的方式执行,因为线程调度程序永远没有机会接管。

如果您向 for 循环添加 sleep :

synchronized void hit(long n) throws InterruptedException {

for (int i = 1; i < 3; i++){
System.out.print(n + "-" + i + " ");
Thread.sleep(0);
}
}

这应该释放调度程序来运行其他线程。请注意,JVM 不提供调度程序实际行为的任何保证,但根据我的经验,上述内容就足够了。

如果您使用的是多核 CPU,我希望它能够按您预期的方式工作,而无需 sleep() 调用。

关于Java 线程 Ping Pong 示例问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402769/

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